流星变量范围
Posted
技术标签:
【中文标题】流星变量范围【英文标题】:Meteor variable scope 【发布时间】:2014-06-09 00:52:29 【问题描述】:我对 javascript 相当陌生,甚至对 Meteor 也很陌生,并且对我认为我对变量范围的了解以及现实情况感到有些困惑。所以我有这个 Meteor 事件助手:
Template.test.events(
'click .selector': function (e)
e.preventDefault();
var someArray = [1,2,3,4];
var someVariable = "jquery slector data";
console.log(someVariable); //this works as expected
someArray.each(function(index, el)
console.log(someVariable); //not defined?
)
)
我的印象是,在我的 .each 函数之外声明的任何变量都可以在其中使用?但是我没有定义。这是 Meteor 特有的东西还是一般的 JavaScript?另外,如何使变量在 .each 函数中可访问而不使它们成为全局变量?我不认为在 .each 循环中定义我的变量是理想的,因为这意味着要多次访问 DOM。
谢谢。
【问题讨论】:
【参考方案1】:问题似乎是您正在尝试使用each()
方法,而Array.prototype
上不存在该方法。我相信您正在寻找Array.prototype.forEach()
。 Underscore 的_.each(array, callback)
方法也可以使用,并且更兼容旧版浏览器。
这应该可行:
Template.test.events(
'click .selector': function (e)
e.preventDefault();
var someArray = [1,2,3,4];
var someVariable = "jquery slector data";
console.log(someVariable);
someArray.forEach(function(val, index)
console.log(someVariable);
);
);
或者,为了兼容性:
_.each(someArray, function(val, index)
console.log(someVariable);
)
我相信您的困惑源于使用 jQuery 的 $.each()
方法,该方法与原生的 forEach
和 Underscore 的 _.each()
的工作方式不同。一方面,jQuery 有不同的参数顺序(注意我在代码中切换了参数的顺序)。一般来说,我建议将 Underscore 用于与集合相关的函数,而将 jQuery 主要用于 DOM 操作。
【讨论】:
感谢您的回复。我将您的示例复制到我的 chrome 控制台中,它可以工作。console.log(someVariable)
正在返回“jquery 选择器数据”。但是,当我将完全相同的代码放入 Meteor 事件处理程序时,我在 forEach
循环中得到“未定义”。
嗯,它对我来说很好用。 Here's a gist 显示我用来测试它的代码。你能发布你的完整代码吗?
实际上它确实有效! (仍然在这里学习)......我正在做的是在 forEach 循环中暂停代码执行并在控制台中手动输入 someVariable
并且失败了。但是,如果我在事件执行之前将someVariable
包含在forEach 循环中,它确实console.log
提供了正确的数据。我想这基于 Javascript 的闭包是有意义的。再次感谢您的解释。以上是关于流星变量范围的主要内容,如果未能解决你的问题,请参考以下文章
流星JS:“邮件未发送;要启用发送,请设置MAIL_URL环境变量“