var funcs=[];
for(var i=0;i<3;i++){
funcs[i]=function(){
console.log(i);
};
}
for(var j=0;j<3;j++){
funcs[j]();
}
这样,我知道它会提醒所有3。因为这些函数是在我分配给3之后调用的。
但是在下面的代码中,我无法理解为什么会发生这种情况。
for(var i = 0; i < 10; i++) {
setTimeout(function() {
console.log(i);
}, 2000);
}
在我看来,当 i 被赋值为 0 时,第一个函数 setTimeout 会在 i 被赋值为 1 之前执行。
我这个循环的顺序错了吗?
最佳答案
console.log(i) 将在 for 循环完成后被调用,由于 var
的方式,for 循环是函数作用域的。当它到达console.log语句时(2000毫秒)将是10。给出预期结果的一种方法是使用 let
而不是 var
。但是,您将使用 let 删除一些浏览器支持。
关于这个主题的好读物是 getify's "You Don't Know Js" book .
for(let i = 0; i < 10; i++) {
setTimeout(function() {
console.log(i);
}, 2000);
}
关于javascript - 关于 JavaScript 闭包中立即执行函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41498320/