流星变量范围

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环境变量“

流星蝴蝶剑单机任务皇天城

流星客户端访问现有的 mongoDB

流星不会启动。 ejson.js 中的“在严格模式之外尚不支持块范围声明(let、const、函数、类)”

流星 - 如何编写引导模式模板以重新呈现 html 输入值,即使用户已输入它们