2014-02-27 31 views
-2
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); 

如何在時間參數(d)在工作? for循環中的setTimeout。混淆在for循環中使用SetTimeout。setTimeout函數的參數時如何工作的Javascript

+0

的核心概念是在一個循環中使用的封閉的可變 - https://developer.mozilla.org/en- US/docs/Web/JavaScript/Guide/Closures#Creating_closures_in_loops.3A_A_common_mistake –

+1

http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example –

+0

and [IIFE](http:///benalman.com/news/2010/11/immediately-invoked-function-expression/) –

回答

0

的代碼看起來工作正常調用它。

但如果你比較想了解它,你可以最終拿起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." 
0

或許你應該明白(function(arg){})(d)定義了一個匿名函數和immediataly與參數d

+0

是的,我知道這個,但是如何d來和當它生病時間得到原因100在時間 –

+0

我不知道我理解你,'d'被聲明在for循環:'for(var d = 0; d <3; d ++)'@MohammadFaizankhan –

相關問題