2014-04-23 43 views
1

我对JavaScript相当陌生,甚至对流星来说更新,对于我所了解的关于可变范围和现实的了解有点困惑。所以我有这个流星事件帮手:流星可变范围

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? 
    }) 
    } 
}) 

我的印象是,任何变量对外宣称我。每个功能将可在它的内部?但是我没有定义。这是一个流星特定的东西或一般的JavaScript?另外,如何让变量在.each函数中可访问,而不使它们成为全局变量?我不认为在.each循环中定义我的变量将是理想的,因为这意味着多次访问DOM。

谢谢。

回答

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不同的方式工作,并强调的​​茎。首先,jQuery具有不同的参数顺序(注意,我在代码中切换了参数的顺序)。一般来说,我建议使用Underscore来处理与收藏相关的功能,并且主要将jQuery用于DOM操作。

+0

感谢您的回复。我将你的例子复制到我的Chrome控制台中,它可以工作。 'console.log(someVariable)'返回“jquery选择器数据”。 但是,当我在我的Meteor事件处理程序中放入完全相同的代码时,我在forEach循环中得到了“未定义”。 – user2209090

+0

嗯,它对我来说工作得很好。显示我用来测试它的代码[这是一个要点](https://gist.github.com/sbking/11239824)。你能发布你的完整的代码吗? – sbking

+0

其实它工作! (在这里仍然在学习)...我在做的是在forEach循环中暂停代码执行,并在控制台中手动输入'someVariable'并且失败。但是,如果在执行事件之前在forEach循环中包含'someVariable',那么'console.log'确实是正确的数据。我想这基于Javascript的关闭是有意义的。再次感谢您的解释。 – user2209090