2011-12-31 30 views
2

我看到this question執行功能,我不知道這有什麼問題嗎?的setTimeout與參數

var id = 12; 
setTimeout(showGrid ('i want to pass variable ' + id + ' here'), 5000); 

我看過這個問題,我對上面的代碼不是一個好的解決方案感興趣。我只安裝了Chrome瀏覽器,我已經嘗試過了,它可以正常工作。是否有任何瀏覽器問題?

爲什麼匿名函數更好?

回答

5

你可以使用一個封閉:

var id = 12; 
setTimeout(function() { 
    showGrid('i want to pass variable ' + id + ' here'); 
}, 5000); 

而且這裏有一個live demo

編輯(蘆粟)從註釋:

的setTimeout函數需要一個回調或字符串變量。你沒有傳遞這樣的東西,所以你的代碼無效。您直接調用showGrid函數,而不是它應該如何工作。 ShowGrid函數應該僅在5秒鐘後調用。

+0

你可以把它關閉。還是它alreadt – 2011-12-31 16:22:18

+0

好吧,但爲什麼這是更好?其他代碼片段有什麼問題? – Bakudan 2011-12-31 16:29:16

+0

@Milo,其他代碼片段?在你的問題中顯示的那個?如果是,則問題中顯示的代碼段不起作用。 – 2011-12-31 16:29:36

2

setTimout期望的功能作爲它的第一個參數和一個時間作爲第二個參數,則可選的參數傳遞給該函數。所以,如果你有一個函數:

function showGrid(str) { 
    return str; 
} 

,你有以下setTimeout

setTimeout(showGrid("..."), 5000); 

那麼您呼叫showGrid和返回值傳遞給setTimeout,所以它最終是這樣的:

// "..." is returned from showGrid("...") 
setTimeout("...", 5000); 

"..."不是功能。所以有兩種方法可以解決這個問題,你可以創建一個圈套(如Darin的答案),或者在時間之後添加參數。

setTimeout(function() { 
    showGrid("..."); 
}, 5000); 

// same thing 
setTimeout(showGrid, 5000, "..."); 

例子:http://jsfiddle.net/fFg57/

+0

Becareful。它不適用於所有IE版本,這就是爲什麼使用返回另一個函數的函數更好。這比傳遞字符串還要好,因爲eval可能是不安全的。 – 2011-12-31 16:57:11

1
var id = 12; 
setTimeout("showGrid ('i want to pass variable " + id + " here')", 5000); 

,第一參數字符串,就像你會傳遞給eval功能是什麼。

,並注意小osetTimeout