for (let i = 1; i < 5; i++) {
console.log(i);
setTimeout(
function() {
console.log(i);
}, 2000);
}
以上代码的输出是:
1
2
3
4
5
5
5
5
,此代码的预期输出为1 2 3 4 1 2 3 4
。延迟2秒后将显示第二个1 2 3 4
,但是您可以看到输出为5 5 5 5
。有人可以帮助我理解这一点。
问题是i
是在闭包中捕获的,因此,在您的函数启动时,它们都引用了i
,而当前的值为5
:
for (var i = 1; i < 5; i++){
console.log(i);
setTimeout(function(){
console.log(i);
},2000);
}
如果可以使用let
,则可以通过块作用域轻松解决此问题:
let
否则,如果您被限制使用for (var i = 1; i < 5; i++){
console.log(i);
let num = i;
setTimeout(function(){
console.log(num);
},2000);
}
,则可以通过创建一个接受该数字作为参数的工厂函数来解决此问题:
var