在代碼兩種樣品,函數調用製成。第一個和第二個之間的區別在於,在第一個示例中,在進行第二個函數調用之前,第一個函數調用的結果存儲在say2
中。第二個示例立即使用來自sayHello2()
的返回值來調用返回的函數。
如果沒有return
聲明,則sayHello2()
返回undefined
。
這個問題的主張,即刪除say2();
行不會改變行爲,是不正確的。如果您不撥打say2()
,則不會記錄任何內容。
看sayHello2()
:
function sayHello2(name){
// Initialize the text that will be logged
var text='Hello'+name;
// Create the function that will log the message
var say=function(){
console.log(text);
};
// Return the logging function
return say;
}
的sayHello2()
函數返回到調用console.log()
那個小函數的引用。由於函數是JavaScript中的對象值,因此對函數的引用以及任何其他類型的值都可以工作,並且可以存儲在變量中或在表達式中使用。
注意所創建的日誌功能時,這是一個var
initailization完成:
var say=function(){
console.log(text);
};
這是本質上發生了變化say2
同樣的事情:
var say2=sayHello2("David");
除了這裏,在=
符號的右側有一個函數調用而不是函數實例化。
聲明
say2();
因此呼籲在於用從調用返回到sayHello2()
小記錄功能。
第二代碼示例做同樣的事:
sayHello2("David")();
不同之處在於有返回的函數參照的沒有中間存儲。相反,引用立即用於進行第二次函數調用。
在第一個版本,計數由該函數調用:
var say2 = sayHello2("David"); // First function call
say2(); // Second function call
在第二個版本:
// First // Second
sayHello2("David")();
在JavaScript中,形式的
something()
總是表達意思是「將something
解釋爲對函數的引用,並將其稱爲(不傳遞參數TER值)。」如果something
不是對函數的引用,則會發生異常。因此在版本2中,我們的something
是sayHello2("David")
。因爲它後面有第二組空括號,這意味着我們正在告訴JavaScript進行另一個函數調用。
唯一的區別是您將第一步存儲到變量中而不是調用它。第二個就是不使用變量。 – epascarello