【问题标题】:Setting a constant in a javascript function [duplicate]在javascript函数中设置常量[重复]
【发布时间】:2013-05-06 02:03:20
【问题描述】:

看看这段代码:

var arr = new Array();
for (var i = 0; i < 10; i++) {
    arr[i] = {
        func:function() {
            console.log(i);
        }
    }
}
arr[0].func();

我对此感到困惑,因为我认为这会起作用。我基本上希望数组中的每个对象都打印创建函数时赋予它的值。

现在当我调用func() 时,它会在控制台中打印 10。有没有办法让它打印0, 1, 2, 3, 4, 5, 6, 7, 8, 9?谢谢!

【问题讨论】:

标签: javascript function variables


【解决方案1】:

问题是里面的函数引用了每次都会增加的变量“i”。您可以将每次迭代中的“i”值存储在对象旁边的函数中,如下所示:

http://jsfiddle.net/Sgnvp/

var arr = new Array();
for (var i = 0; i < 10; i++) {
    arr[i] = {
        func:function() {
            console.log(this.value);
        },
        value: i
    }
}
arr[0].func();

【讨论】:

    【解决方案2】:

    您必须创建一个闭包来封装该值。在这里,我调用consoleIt 并传递它iconsoleIti 周围创建一个闭包

    var arr = [];
    
    function consoleIt (i) {
        return function () {
            console.log(i);
        }
    };
    
    for (var i = 0; i < 10; i++) {
        arr[i] = { 
            func: consoleIt(i)
        };
    }
    
    arr[0].func();
    

    【讨论】:

      【解决方案3】:

      这并不比 thebreiflabb 的做法更好,但它是一种有趣的技术,值得了解:

          var arr = [];
      
          for (var i = 0; i < 10; i++){
      
            (function(i){
              arr[i] = {
                func : function(){
                  console.log(i); 
                }
              };
            })(i);
      
          }
      
          arr[0].func();
      

      它只是使用匿名闭包来限定 i。

      【讨论】:

        猜你喜欢
        • 2010-11-22
        • 1970-01-01
        • 1970-01-01
        • 2014-06-29
        • 1970-01-01
        • 1970-01-01
        • 2015-08-27
        • 1970-01-01
        • 2015-03-19
        相关资源
        最近更新 更多