在javascript函数中设置常量

在javascript函数中设置常量,javascript,function,variables,Javascript,Function,Variables,请看下面的代码: var arr = new Array(); for (var i = 0; i < 10; i++) { arr[i] = { func:function() { console.log(i); } } } arr[0].func(); var arr=new Array(); 对于(变量i=0;i

请看下面的代码:

var arr = new Array();
for (var i = 0; i < 10; i++) {
    arr[i] = {
        func:function() {
            console.log(i);
        }
    }
}
arr[0].func();
var arr=new Array();
对于(变量i=0;i<10;i++){
arr[i]={
func:function(){
控制台日志(i);
}
}
}
arr[0].func();
我对此感到困惑,因为我认为这会奏效。基本上,我希望数组中的每个对象打印创建函数时所给的值。


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

问题在于内部函数引用的变量“i”每次都会增加。在对象中的每次迭代中,可以将“i”的值与函数一起存储,如下所示:

var arr=new Array();
对于(变量i=0;i<10;i++){
arr[i]={
func:function(){
console.log(this.value);
},
价值:i
}
}
arr[0].func();

问题在于,内部函数引用的变量“i”每次都会增加。在对象中的每次迭代中,可以将“i”的值与函数一起存储,如下所示:

var arr=new Array();
对于(变量i=0;i<10;i++){
arr[i]={
func:function(){
console.log(this.value);
},
价值:i
}
}
arr[0].func();

您必须创建一个闭包来封装该值。我在这里调用
consoleIt
并将其传递给
I
consoleIt
i

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();
var arr=[];
功能控制台(一){
返回函数(){
控制台日志(i);
}
};
对于(变量i=0;i<10;i++){
arr[i]={
func:consoleIt(一)
};
}
arr[0].func();

您必须创建一个闭包来封装该值。我在这里调用
consoleIt
并将其传递给
I
consoleIt
i

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();
var arr=[];
功能控制台(一){
返回函数(){
控制台日志(i);
}
};
对于(变量i=0;i<10;i++){
arr[i]={
func:consoleIt(一)
};
}
arr[0].func();

这实际上并不比Breiflab的做法好多少,但这是一项值得了解的有趣技术:

    var arr = [];

    for (var i = 0; i < 10; i++){

      (function(i){
        arr[i] = {
          func : function(){
            console.log(i); 
          }
        };
      })(i);

    }

    arr[0].func();
var arr=[];
对于(变量i=0;i<10;i++){
(职能(一){
arr[i]={
func:function(){
控制台日志(i);
}
};
})(i) );
}
arr[0].func();

它只是使用一个匿名闭包来定义范围i。

这实际上并不比Breiflab的做法好多少,但这是一种值得了解的有趣技术:

    var arr = [];

    for (var i = 0; i < 10; i++){

      (function(i){
        arr[i] = {
          func : function(){
            console.log(i); 
          }
        };
      })(i);

    }

    arr[0].func();
var arr=[];
对于(变量i=0;i<10;i++){
(职能(一){
arr[i]={
func:function(){
控制台日志(i);
}
};
})(i) );
}
arr[0].func();

它只是对范围i使用匿名闭包。

是的,这是一个闭包问题。请,请,将此作为副本关闭。另一个:是的,这是一个闭包问题。请,请,将此作为副本关闭。另一个: