2011-08-24 70 views
7

我有一個名爲「tryMe」的函數,我沒有括號括起來就是這樣調用它,但這個想法就像你會在這裏做的那樣:如何在調用沒有圓括號的函數時傳遞參數[Javascript]

setTimeout(tryMe,200); 

如何傳遞我需要的參數?

我正在使用一個jquery插件,使我可以調用一個函數,但我必須調用它與括號或它加載時執行它自己。

+1

它執行的原因是函數被計算並且函數的結果被傳遞給'setTimeout';函數本身並不像你期望的那樣傳遞。 – Marc

+2

描述你在做什麼是不正確的,「調用沒有括號的函數」。該函數不會在您發佈在您的問題中的聲明中調用。相反,函數的* reference *被傳遞給另一個函數('setTimeout'),在另一個時間(200毫秒後,實際上)用**圓括號(概念上)調用函數**。儘管如此,你在這裏問的是一個非常常見的混淆點,答案並不明顯。 – Pointy

+0

@Pointy謝謝你向我解釋=) – Tsundoku

回答

11
setTimeout(function() { tryMe(parm1, parm2); }, 200); 

一個更強大的產品,以確保 parm1值, parm2不超時火災前更改(每@ lincolnk的評論):

setTimeout(function() { 
    var p1 = parm1; 
    var p2 = parm2; 
    tryMe(p1, p2); 
}, 200); 

@帕特里克dw,你是對的,必須先進行評估。

+3

只要確保你沒有改變你的參數值超時之前觸發。 – lincolnk

+1

您的更新不會與原始文件有任何不同。爲了確保在調用setTimeout時存在的值,您需要調用一個函數,在* that *函數中本地引用它們,並讓該函數返回一個引用本地定義的引用的函數。 – user113716

+0

更優雅的方法是使用__setTimeout(tryMe.bind(window,parm1,parm2),200); __。 bind()不支持IE8或更低版本,但可以使用javascript等效實現。 –

4

您可以將tryMe包裝在封口中。

例如:

var f = function(){tryMe('some parameter');}; 
setTimeout(f, 200); 

在這裏,我們創建一個功能對象,f,它調用tryMe與期望的參數(一個或多個)。然後我們通過fsetTimeout。當超時到期時,將調用f,然後調用tryMe和期望的參數。

提醒一句,如果你希望在可能的超時之前更改參數傳遞被調用(例如,如果你是在一個for迴路設置幾個超時):你將要綁定這些變量,像這樣:

var f = function(someParamter){return function(){tryMe(someParameter);};}; 
setTimeout(f(someParameter), 200); 

的原因簡單地做喜歡

setTimeout(tryMe('some parameter'), 200); //Does not work. 

東西不工作是因爲你逝去的評估tryMe,而不是函數對象本身tryMe的結果。

+0

這應該是正確的答案 –

0

您沒有在200毫秒後調用該函數。你只是提供需要被調用的函數。火狐實際上允許在setTimeout調用指定其他參數:

setTimeout(tryMe, 200, "first parameter", "second parameter"); 

不過,據我所知,沒有其他的瀏覽器都支持此功能,因此你應該使用閉包功能通過其他的答案已經解釋。在此創建一個臨時函數,其唯一目的是用正確的參數調用原始函數。

setTimeout(function() {tryMe("first parameter", "second parameter")}, 200); 
相關問題