流星变量范围

时间:2014-04-23 23:26:09

标签: javascript variables scope meteor each

我是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 个答案:

答案 0 :(得分:3)

问题似乎是您尝试使用each()上不存在的Array.prototype方法。我相信你正在寻找Array.prototype.forEach()。下划线的_.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操作。