2012-05-17 23 views
1

請讓我知道我是否以錯誤的角度來到這個街區。我有一系列我想要啓動的功能,我希望能夠將它們全部設置爲循環。在setTimeout函數方法中使用一個變量值的變量?

for(var jj = 0; jj<monster.frames.length;jj++){ 
    setTimeout(
     functionName(jj), 
     1000*jj 
    ); 
} 

的問題是,當,當functionName(jj)被exectuted,它正在通過其由時間已更改爲最後的循環迭代值的jj值。

+2

的可能重複的[使用Javascript閉合環內 - 簡單實用示例](http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example) – davin

+0

HTTP:/ /stackoverflow.com/questions/341723/event-handlers-inside-a-javascript-loop-need-a-closure http://stackoverflow.com/questions/1331769/access-outside-variable-in-loop-from- javascript-closure http://stackoverflow.com/questions/1413916/javascript-closure-immediate-evaluation – davin

+0

duplicate--> http://stackoverflow.com/questions/2171602/settimeout-and-anonymous-function-problem – rt2800

回答

13

您需要確保內部函數每次迭代的新變量。最簡單的方法是創建一個自動執行的匿名函數,它接收變量作爲參數。您還需要修復調用函數的方式 - 現在您將回調值functionName(jj)註冊爲回調函數。如果該函數實際返回一個函數,這隻會是確定的。

for(var jj = 0; jj<monster.frames.length;jj++){ 
    (function(jj) { 
     setTimeout(
      function() { functionName(jj); }, 
      1000*jj 
     ); 
    })(jj); 
} 

您還可以使用部分應用程序創建一個新的功能。但是,舊版瀏覽器不支持Function.prototype.bind,因此您必須爲其添加墊片。

for(var jj = 0; jj<monster.frames.length; jj++){ 
    setTimeout(functionName.bind(this, jj), 1000*jj); 
} 
1

給這個一展身手:

for(var jj = 0; jj < monster.frames.length; jj++) 
{ 
    (function(x) 
    { 
     setTimeout(function() 
     { 
      functionName(x) 
     }, 1000 * x); 
    })(jj); 
} 
相關問題