1
我不知道如何解釋下面的代碼,爲什麼按預期不起作用:的setTimeout回調Explination
for (var i = 0; i < 16; i++) {
setTimeout(function() {
console.log(i);
}, 1)
}
// Prints "16" 16 times
一個解決方案,這將被簡單地使用let
代替var
在for循環,或者
for (var i = 0; i < 16; i++) {
(function (k) {
setTimeout(function() {
console.log(k);
}, 100)
})(i)
}
// Print "0" to "15"
自我調用功能。
如果我可以有一個有教養的猜測這將是var的範圍綁定到功能塊,或在全球範圍的情況下,for循環將擊敗調用堆棧,setTimeout()
將產生和自Javascript是詞彙的作用域,它回調所有這些功能爲var i = 16
另一方面let i = 16
將保持它的塊?
'setTimeout'在* i循環後執行* – Li357
請參閱[如何閉包](http://stackoverflow.com/questions/111102/how-do-javascript-closures-work) – Rajesh