2013-06-29 193 views
2

在使用一些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都不會僅僅通過讓它們成爲參數而被調用。

再次,我正在尋找一些解釋如何工作的文檔。

+6

你需要知道的文檔是'()'調用一個函數,否則你只是引用一個函數。你的第一行將'f1'和'f2'函數的引用傳遞給'f3'。你的第二行立即調用'f1'和'f2',並將它們的返回值(「undefined」,因爲它們不返回任何東西)傳遞給'f3'。由於'f3'對'a'和'b'沒有任何作用,所以如果你調用它們,通過 – Ian

+0

並不重要,你將函數的返回值作爲參數傳遞,而不是函數本身。由於參數在傳遞之前已經被解決,所以js不知道在調用中實際發生了什麼。在你的情況下,所有的函數都返回undefined,但是因爲你從不使用參數,所有這些都沒有關係。 – dandavis

+0

有些語言可以延遲函數調用。 JavaScript沒有這種能力。當你打電話時,立即打電話給他。 –

回答

2

在你下聯:

f3(f1(), f2()); 

你不通過f1f2,你是,他們調用,並將它們的(未定義的)返回值傳遞給f3

+0

簡單而重要的是,愛這些答案 – Mataniko

0

你的邏輯令人費解。你傳遞的參數你從來沒有用過,但讓我們用拳擊 。

您的問題關於報警的數量; 您將參數傳遞給從不使用它們的函數,然後調用它。 所以實際發生的事情是:

function f3(a, b) 
{ 
console.log("argument 1: " + arguments[0]); //Access the arguments fed to the function 
console.log("argument 2: " + arguments[1]); 
    alert('f3'); 
} 
* 

f3(f1, f2); 流行警告 「F3」 *

and logs: 
argument 1: function f1() 
{ 
    alert('f1'); 
} 
argument 2: function f2() 
{ 
    alert('f2'); 
} 

f3(f1(),f2())

彈出所有的警報 和原木:

argument 1 undefined 
argument 2 undefined 
+0

永遠不要使用這些功能,因爲這是一個玩具的例子,剝離了所有extranous功能。當然在真正的代碼中,這些函數有一個目的並被使用。 –

1

簡單地說,作爲一個參數傳遞會立即調用函數時加()的函數,甚至。設置超時的例子:

function doStuff() { 
    alert("ok"); 
} 

setTimeout(doStuff(), 300); 

你,因爲函數立即調用會立即發出警報ok。設置超時時間爲:

setTimeout(doStuff, 300); 

只有在調用超時時纔會立即提醒,因爲您正在以正確的參數傳遞函數。

你通常會看到傳過來像這樣的AJAX回調函數參數的函數。

setTimeout的文檔有回調函數的極大部分:https://developer.mozilla.org/en-US/docs/Web/API/window.setTimeout

(是的,我知道setTimeout在問題沒有得到使用,但我覺得這個例子有助於回答很好的問題)

0

當一個函數參數的很清楚,括號是用來立即調用它

function sum(a, b){ 
    return a + b; 
} 

console.log(sum(1, 2)); //prints 3 

f()版本的這個地方你的參數列表是空的只是一個特例。