有谁知道为什么这段代码的输出是5倍?
for (var i = 0; i < 5; i++) {
setTimeout(function() { console.log(i); }, i * 1000 );
}
for语句永远不会到达5:S
答案 0 :(得分:3)
您需要创建一个闭包以保留i
变量的值。否则,i
变量将是setTimeout
执行时的最后一次迭代的值
for (var i = 0; i < 5; i++) {
(function(i){
setTimeout(function() { console.log(i); }, i * 1000 );
})(i);
}
请阅读有关IIFEs
的内容答案 1 :(得分:1)
只需修改一下你的代码,就可以了:
for (var i = 0; i < 5; i++) {
setTimeout(function(x) { console.log(x); }, i * 1000, i);
}
答案 2 :(得分:0)
关闭的经典例子:
闭包是指独立(自由)变量的函数。在 换句话说,封闭中定义的函数会记住&#39;该 它创建的环境。
您的内部函数可以访问环境(在此示例中使用外部变量 i )。循环结束后, i 的值为5,您的函数使用此值。当然,如果你在循环结束后使用 console.log(i)。
试试这篇文章 - Closure - MDN