2013-09-26 45 views
1

爲什麼在將函數傳遞給replace的最後一個參數時,該函數不帶括號?爲什麼函數傳遞替換不帶括號

MDN

function replacer(match, p1, p2, p3, offset, string){ 
    // p1 is nondigits, p2 digits, and p3 non-alphanumerics 
    return [p1, p2, p3].join(' - '); 
}; 
newString = "abc12345#$*%".replace(/([^\d]*)(\d*)([^\w]*)/, replacer); 

回答

0

這裏有一個小的細微差別,可能是很難在第一把握。

如果您要添加圓括號,則表示您希望replacer在此時和之後被調用。這實際上並不是你想要做的。

replace實際上是在尋找一個函數的引用,所以你實際上是在傳遞函數作爲參數到replace。在內部,replace知道何時何地正確調用replacer

2

如果添加了圓括號,則會評估名爲replacer的函數表達式。

而是在這裏傳遞一個名爲replacer的變量,它是對該函數的引用。如果不是馬上執行此功能,那麼請在本機調用Javascript的replace時使用它以後的

我有時想到的一個比喻是,你正在交出一把槍給別人開火,你不是自己開火。 replacer()的意思是「立即開槍」,而replacer的意思是「這裏,用這個來開火」。這裏的期望是,JavaScript的本地功能將用子彈(參數)「加載槍」,然後在準備就緒時觸發它。

+0

而不是..? – 1252748

+0

這是相反的,而不是傳遞一個函數的參考 –

0

因爲當你使用帶括號的函數名f()時,你需要調用函數並使用結果。當你沒有括號使用時,f,如果意味着你正在使用函數本身。如果有幫助,可以考慮使用引用函數的代碼,而不是返回的值。

在您的示例中,您沒有調用函數替換器並傳遞值來替換。您正在傳遞一段代碼,稱爲替換函數replace,以便函數replace在需要時調用它。

0

在JavaSCript中,函數是一個像其他任何對象一樣的對象。它可被分配給一個變量,傳遞給函數,從函數返回等

在這種情況下,以replacer參考被用作可變這裏:

newString = "abc12345#$*%".replace(/([^\d]*)(\d*)([^\w]*)/, replacer); 

函數本身正在傳入呼叫replace。 (這將可能執行的是內部函數,至少某些條件下)。如果括號中加入這樣的:

newString = "abc12345#$*%".replace(/([^\d]*)(\d*)([^\w]*)/, replacer()); 

然後而不是傳遞函數本身作爲參數,你會傳遞的結果作爲參數的函數。該函數的結果似乎是一個字符串。然而,你調用的函數並不期望一個字符串,它需要一個函數。 (傳遞一個字符串可能會失敗,當它試圖「執行」該字符串。)

+1

我認爲OP的混淆是替代者期望參數和回調似乎並沒有發送它們。只是猜測的原因,我想知道,當我第一次看到這一點。 –

+0

@凱卿:可能。雖然我們沒有看到「replacer」被調用的位置,但我們並沒有看到它是否接收參數。在這種情況下,我會假設'replace'在內部將它們提供給回調函數。 – David

+0

@KaiQing是的,就是這樣。它如何獲得這些參數? – 1252748

0

這是一個callback

如果您致電replacer(),那麼您將運行replacer function而不帶任何參數。

在這種情況下,替換函數要求callback as the second parameter,替換方法將調用給定的可調用參數本身。

認爲它這樣,你可以做這樣的事情之內更換功能:

.replace(/([^\d]*)(\d*)([^\w]*)/, function() { 
    //You can write replacer's code here as a closure 
}); 

而不是定義這樣一個封閉的,你告訴替換功能調用替代品的功能。

0

原因是因爲replacer是一個函數指針。就像你可以有指向變量實例的指針一樣,你可以指向函數指針。如果括號被放置在replacer之後,例如replacer()那麼replacer將被評估爲函數本身。相反,您正在做的是將指針傳遞給函數replacer,然後可以使用函數replace調用該函數。

在C++中:這種模式的替代方法的一個常見用法是函數對象/函數指針。其中struct/object將operator()重載以使其像函數一樣工作。但是大多數語言都有一個這樣的版本,無論它們被稱爲仿函數,回調,函數指針或其他。

相關問題