我在教程中找到了一些例子(说这是规范的例子)
for (var i=1; i<=5 ; i++) {
setTimeout(function() {
console.log("i: " + i);
}, i*1000);
}
现在,我理解,闭包在当前作用域中传递给函数,我假设它应该输出1,2,3,4,5。但相反,它打印数字6五次。
我在chrome调试器中运行它,首先它在没有进入函数的情况下进行循环,同时执行i值的增量,然后只进行内部函数并执行5次。
我不知道为什么它这样做,我知道,由于闭包,当前的作用域被传递给函数,但为什么每次循环迭代都不执行它?
答案 0 :(得分:4)
超时运行时,for
循环已完成,i
为6,这就是您获得输出的原因。您需要在循环期间捕获i
:
for (var i=1; i<=5 ; i++) {
(function(innerI) {
setTimeout(function() {
console.log("i: " + innerI);
}, innerI*1000);
})(i);
}
这会创建一个带有自己的参数(innerI
)的内部函数,该参数会立即被调用,因此会捕获i
的值以便在超时时间内使用。
答案 1 :(得分:0)
谢谢你的帮助, 我找到了另一个解决方案,这是一个小小的改变。
在页面顶部,我打开了严格模式,也在for循环中,而不是var,我使用了“let”关键字。