的代碼看起來工作正常調用它。
但如果你比較想了解它,你可以最終拿起JS的進口貿易.. 瓶蓋
所以第一次運行它像這樣
for (var d = 0; d < 3; d++)
setTimeout(function() {
console.log("Value of d: ", d);
console.log(d == d, "Check the value of d.");
}, d * 200);
的輸出:
Value of d: 3
true "Check the value of d."
Value of d: 3
true "Check the value of d."
Value of d: 3
true "Check the value of d."
您是否注意到未遞增的值d
?這是因爲任何的setTimeout函數的實際執行之前的d
的值變爲3。所以,你需要的是與價值1,2,3 d
三個副本。
這可以通過執行即時功能&在定義setTimeout函數本身時保存d
的值來實現。我們主要做的是一個包裹,其中範圍爲d
訪問後(後setTimeout的功能打完折)內的每個電話。
因此您的代碼:
for (var d = 0; d < 3; d++) (function(d) {
setTimeout(function() {
console.log("Value of d: ", d);
console.log(d == d, "Check the value of d.");
}, d * 200);
})(d);
產生輸出:
Value of d: 0
true "Check the value of d."
Value of d: 1
true "Check the value of d."
Value of d: 2
true "Check the value of d."
的核心概念是在一個循環中使用的封閉的可變 - https://developer.mozilla.org/en- US/docs/Web/JavaScript/Guide/Closures#Creating_closures_in_loops.3A_A_common_mistake –
http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example –
and [IIFE](http:///benalman.com/news/2010/11/immediately-invoked-function-expression/) –