在JavaScript中,变量i没有传递到循环中的函数中

在JavaScript中,变量i没有传递到循环中的函数中,javascript,Javascript,我理解var I不存在块级范围;但是,在下面的代码中,d.push();是在i的初始化之后执行的,为什么我在这里没有定义 var d = []; for (var i = 0; i < 3; i++) { d.push(function(i) { console.log('iterator: ' + i); }); } d[0]();//undefined var d=[]; 对于(变量i=0;i

我理解var I不存在块级范围;但是,在下面的代码中,d.push();是在i的初始化之后执行的,为什么我在这里没有定义

var d = [];
for (var i = 0; i < 3; i++) {
     d.push(function(i) {
        console.log('iterator: ' + i);
    });
}
d[0]();//undefined
var d=[];
对于(变量i=0;i<3;i++){
d、 推送(功能(一){
log('iterator:'+i);
});
}
d[0]()//未定义

您可以使用推送匿名函数的参数绑定版本,从而确保第一个参数的值

var d = [];
for (var i = 0; i < 3; i++) {
    d.push((function(i) {
        console.log('iterator: ' + i);
    }).bind(this, i));
}
d[0](); // iterator: 0
d[1](); // iterator: 1
d[2](); // iterator: 2
var d=[];
对于(变量i=0;i<3;i++){
d、 推动(功能(i){
log('iterator:'+i);
}).绑定(这个,我));
}
d[0]();//迭代器:0
d[1]();//迭代器:1
d[2]();//迭代器:2
以下是我的解决方案:

var d = [];

function newFunction(i) {
    var k = i; 
    return function() {
        console.log('iterator: ' + k);
    }
}
for (var i = 0; i < 3; i++) {
     d.push(
        newFunction(i)
    );
}
d[0]();
d[1]();
var d=[];
函数newFunction(i){
var k=i;
返回函数(){
log('iterator:'+k);
}
}
对于(变量i=0;i<3;i++){
d、 推(
新功能(一)
);
}
d[0]();
d[1]();

这是因为当您创建新函数时,它会创建一个变量范围,该范围不会随for循环而改变。它在每次迭代时保存
i
的状态,这样当您再次调用它们时,它将与最初声明的
i
一起运行。

您推了一个异常函数
函数(i){console.log('iterator:'+i);}
,该函数有一个参数
i
。但是当你调用函数时,
d[0](),您没有传递任何参数。