Javascript 由于引用访问,值被覆盖 a=[]; 对于(变量i=0;i

Javascript 由于引用访问,值被覆盖 a=[]; 对于(变量i=0;i,javascript,Javascript,我试图编写一段简单的代码,其中有一个函数数组,这样当我在特定索引处执行函数时,应该打印索引值 但是,上面的代码显示了所有索引值的相同结果(本例中为3)。我理解该值通过引用指向,因此指向I的最后一个值。有人能指出如何以正确的方式执行此操作吗?将其围绕函数进行包装。现在,每次循环执行时,包装器函数都有自己的值i a = []; for (var i = 0; i < 3; i++) { a.push(function() { console.log(i); }) }

我试图编写一段简单的代码,其中有一个函数数组,这样当我在特定索引处执行函数时,应该打印索引值


但是,上面的代码显示了所有索引值的相同结果(本例中为3)。我理解该值通过引用指向,因此指向I的最后一个值。有人能指出如何以正确的方式执行此操作吗?

将其围绕函数进行包装。现在,每次循环执行时,包装器函数都有自己的值
i

a = [];
for (var i = 0; i < 3; i++) {
   a.push(function() {
      console.log(i);
   })
}

a[0]()     // I want 0, but I get 3
a=[];
对于(变量i=0;i<3;i++){
(职能(一){
a、 推送(函数(){
控制台日志(i);
})
})(i) );
}
a[0]()

将其环绕在函数周围。现在,每次循环执行时,包装器函数都有自己的值
i

a = [];
for (var i = 0; i < 3; i++) {
   a.push(function() {
      console.log(i);
   })
}

a[0]()     // I want 0, but I get 3
a=[];
对于(变量i=0;i<3;i++){
(职能(一){
a、 推送(函数(){
控制台日志(i);
})
})(i) );
}
a[0]()

将其环绕在函数周围。现在,每次循环执行时,包装器函数都有自己的值
i

a = [];
for (var i = 0; i < 3; i++) {
   a.push(function() {
      console.log(i);
   })
}

a[0]()     // I want 0, but I get 3
a=[];
对于(变量i=0;i<3;i++){
(职能(一){
a、 推送(函数(){
控制台日志(i);
})
})(i) );
}
a[0]()

将其环绕在函数周围。现在,每次循环执行时,包装器函数都有自己的值
i

a = [];
for (var i = 0; i < 3; i++) {
   a.push(function() {
      console.log(i);
   })
}

a[0]()     // I want 0, but I get 3
a=[];
对于(变量i=0;i<3;i++){
(职能(一){
a、 推送(函数(){
控制台日志(i);
})
})(i) );
}
a[0]()
您可以添加一个类似模块的组件。这样,变量
i
的范围就在该函数中

a=[];
对于(变量i=0;i<3;i++){
(职能(一){
a、 推送(函数(){
警报(一);
})
})(i) );
}
a[0]()
您可以添加一个类似于模块的函数。这样,变量
i
的范围就在该函数中

a=[];
对于(变量i=0;i<3;i++){
(职能(一){
a、 推送(函数(){
警报(一);
})
})(i) );
}
a[0]()
您可以添加一个类似于模块的函数。这样,变量
i
的范围就在该函数中

a=[];
对于(变量i=0;i<3;i++){
(职能(一){
a、 推送(函数(){
警报(一);
})
})(i) );
}
a[0]()
您可以添加一个类似于模块的函数。这样,变量
i
的范围就在该函数中

a=[];
对于(变量i=0;i<3;i++){
(职能(一){
a、 推送(函数(){
警报(一);
})
})(i) );
}

[0]()
这里是一个匿名函数的替代版本,它可以一次创建并执行

您遇到的问题是,当调用函数时,循环已经被计算,并且
i
的值已经达到
3
的最大值。在对循环求值时,需要捕获
i
的当前值

var a=[];
对于(变量i=0;i<3;i++){
var fn=函数(){
log(arguments.callee.i);
}
fn.i=i;//作为'i'参数传递给'fn'。
a、 推(fn);
}

a[0]();//值0将被打印,而不是3。
这里是一个匿名函数的替代版本,该匿名函数一次创建并执行

您遇到的问题是,当调用函数时,循环已经被计算,并且
i
的值已经达到
3
的最大值。在对循环求值时,需要捕获
i
的当前值

var a=[];
对于(变量i=0;i<3;i++){
var fn=函数(){
log(arguments.callee.i);
}
fn.i=i;//作为'i'参数传递给'fn'。
a、 推(fn);
}

a[0]();//值0将被打印,而不是3。
这里是一个匿名函数的替代版本,该匿名函数一次创建并执行

您遇到的问题是,当调用函数时,循环已经被计算,并且
i
的值已经达到
3
的最大值。在对循环求值时,需要捕获
i
的当前值

var a=[];
对于(变量i=0;i<3;i++){
var fn=函数(){
log(arguments.callee.i);
}
fn.i=i;//作为'i'参数传递给'fn'。
a、 推(fn);
}

a[0]();//值0将被打印,而不是3。
这里是一个匿名函数的替代版本,该匿名函数一次创建并执行

您遇到的问题是,当调用函数时,循环已经被计算,并且
i
的值已经达到
3
的最大值。在对循环求值时,需要捕获
i
的当前值

var a=[];
对于(变量i=0;i<3;i++){
var fn=函数(){
log(arguments.callee.i);
}
fn.i=i;//作为'i'参数传递给'fn'。
a、 推(fn);
}

a[0]();//将打印值0,而不是3。
这是和的副本。请参考此问题进行详细解释。非常感谢@Mr.Polywhill这是和的副本。请参考此问题进行详细解释。非常感谢@Mr.Polywhill这是和的副本。请参考此问题进行详细解释。非常感谢@Mr.Polywhill这是和的副本。请参考此问题进行详细解释。非常感谢@Mr.Polywhill