【问题标题】: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。

谢谢。

【问题讨论】:

    标签: javascript variables scope meteor each


    【解决方案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 的闭包是有意义的。再次感谢您的解释。
    猜你喜欢
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2017-10-07
    • 1970-01-01
    • 2016-06-25
    • 2016-05-26
    • 1970-01-01
    • 2016-12-06
    相关资源
    最近更新 更多