在使用一些JavaScript時,我遇到了令人困惑的行爲,我正在尋找一些解釋發生了什麼的文檔。傳遞javascript函數作爲參數
問題似乎是,根據函數的傳遞方式,當我認爲它們只是參數時,它們可能會被執行。
下面是一個簡單的例子:
function f1()
{
alert('f1');
}
function f2()
{
alert('f2');
}
function f3(a, b)
{
alert('f3');
}
兩個調用以上的版本:
f3(f1, f2); // shows 1 alert
f3(f1(), f2()); // shows 3 alerts
F3的在上面的的F1和F2功能結果第一次調用不會被調用,你得到一個「f3」的警報。 f3函數的第二次調用被調用,所以你會得到三個「f1」,「f2」和「f3」警報。
在實際的代碼中,我將使用第一個版本,以便f3可以決定是否要調用f1和f2。我花了一些時間來糾正錯誤。
我沒有想到這種行爲,並認爲無論是否帶圓括號的f1和f2都不會僅僅通過讓它們成爲參數而被調用。
再次,我正在尋找一些解釋如何工作的文檔。
你需要知道的文檔是'()'調用一個函數,否則你只是引用一個函數。你的第一行將'f1'和'f2'函數的引用傳遞給'f3'。你的第二行立即調用'f1'和'f2',並將它們的返回值(「undefined」,因爲它們不返回任何東西)傳遞給'f3'。由於'f3'對'a'和'b'沒有任何作用,所以如果你調用它們,通過 – Ian
並不重要,你將函數的返回值作爲參數傳遞,而不是函數本身。由於參數在傳遞之前已經被解決,所以js不知道在調用中實際發生了什麼。在你的情況下,所有的函數都返回undefined,但是因爲你從不使用參數,所有這些都沒有關係。 – dandavis
有些語言可以延遲函數調用。 JavaScript沒有這種能力。當你打電話時,立即打電話給他。 –