2012-05-13 118 views
6

我想將參數傳遞給使用setTimeout調用的函數。我發現這三個選項:如何將參數傳遞給使用setTimeout調用的函數?

A = 1; 
// Method 1: closure things 
setTimeout(function() { whatsA(A); }, 100); 
// Method 2: third argument (same result with [A]) 
setTimeout(whatsA, 100, A); 
// Method 3: eval 
setTimeout('whatsA(' + A + ')', 100); 
A = 2; 
function whatsA(X) { console.log(X); } 

這說明2undefined,並1在Internet Explorer 9

方法1:很顯然,我不希望將參數傳遞後更改(當然在簡單整數的情況下)。

方法2:如果只有Internet Explorer支持它,這將是完美的。

方法3:這似乎是唯一的選擇。但它似乎不像其他人那麼漂亮,傳遞了一些需要評估的東西而不是一種功能。

有沒有更好的方法?

+2

方法3是一個你應該**從不**使用。方法2即使在壁虎瀏覽器中也不推薦使用 - 所以即使沒有支持IE,它也幾乎是不可行的。 – ThiefMaster

回答

7

我能想到的是使用bind()的最佳解決方案:

A = 1; 
setTimeout(whatsA.bind(this, A), 100); 

因爲bind()實際上是一個函數調用,它讀取當前A值,並返回綁定爲一個參數,值的函數。如果你覺得很難理解,試試這個:

var newFun = whatsA.bind(this, 42); 
newFun() 

注意this是那種在這裏騙人的 - 你可以安全地通過window爲好。


第一種方法是可以接受的,它只是需要稍微改進:

A = 1; 
var tmpA = A; 
setTimeout(function() { whatsA(tmpA); }, 100); 

你所觀察到實際上是一個功能,而不是一個錯誤。您正在通過關閉引用局部變量setTimeout()。 JavaScript足夠聰明,可以在該函數實際調用的時刻延遲對該變量的訪問。而且,由於您修改了變量,因此您會看到最新的版本。


第二種方法已被棄用不會在任何瀏覽器工作。


第三種方法是可怕的,避免將字符串setTimeout(),總是有一個更好的解決方案。

+0

也有'whatsA.apply(this,[A])'和'whatsA.call(this,A)'解決方案。 – VisioN

+0

爲乾淨的'.bind()'解決方案+1。 @VisionN:這些版本需要自調用函數來避免關閉變量。 – ThiefMaster

+0

*你可以安全地通過窗口以及* - 或'null'這是更清潔的恕我直言。 – ThiefMaster

4

你可以使用封閉:

setTimeout((function(A){ 
       return function(){ 
        whatsA(A); 
       }; 
      })(A), 100); 
+0

+1真的好主意! – VisioN

0

的三種方法中:

選項1:

setTimeout(function() { whatsA(A); }, 100);

這一次的作品無處不在,也很簡單。這是我會推薦的,除非在調用setTimeout函數之前變量A可能會改變。如果您需要凍結A的值,請參閱下面的我的選項4。


選項2:

setTimeout(whatsA, 100, A);

在某些瀏覽器裏,才能工作。不建議。


方案3:

setTimeout('whatsA(' + A + ')', 100);

這是從來沒有建議。將代碼構建爲字符串,然後再進行評估幾乎不是最佳解決方案。


我會建議選項4

凍結A值,你可以創建一個使用自執行功能的關閉:

A = 1; 

function(A) { 
    setTimeout(function() {whatsA(A);}, 100); 
}(A); 

A = 2; 
function whatsA(X) { console.log(X); } 
相關問題