2017-06-16 194 views
0

您能否解釋爲什麼doctor1函數的返回函數會比醫生2中的更好?返回匿名函數

//-----------------Doctor 1-------------------------- 
 

 
function doctor1() { 
 
    return function() { alert("How are you, today?"); }; 
 
} 
 

 
var x = doctor1(); 
 
x(); 
 

 

 
//-----------------Doctor 2-------------------------- 
 

 
function doctor2() { 
 
    return alert("How are you, today?"); 
 
} 
 

 
doctor2(); 
 

 
//-------------------------------------------

+0

[var functionName = function(){} vs function functionName(){}](https://stackoverflow.com/questions/336859/var-functionname-function-vs-function-functionname) –

+0

什麼可能重複你的意思是_be better_? – destoryer

+0

@destoryer,我的意思是哪一個是正確的,或者如果有某種情況下你想使用其中一個! – Aseel

回答

1

你的具體情況有沒有真正的差別。但是,如果你想創建一個保留一些狀態的功能(即創建閉包),返回一個功能可能是有用的:

function doctor1(num) { 
    return function() { alert("How are you, today? " + num); }; 
} 

var functions = []; 

for (var i = 0; i < 3; i++) { 
    functions.push(doctor1(i)); 
} 

// The functions "remember" the values 0, 1, and 2 
for (var i = 0; i < functions.length; i++) { 
    functions[i](); 
} 

順便說一句,你doctor2功能並不需要一個return語句,因爲沒有按alert」 t返回任何東西。

編輯:我想澄清的是返回的功能並不一定是匿名:

function doctor1(num) { 
    return function myFunc() { alert("How are you, today? " + num); }; 
} 

命名這樣的功能調試時可以提供幫助。如果該函數引發錯誤,您將在控制檯中看到函數名稱。

+0

謝謝你的幫助。如果你不介意爲什麼那麼當我提醒函數數組時,num不會被分配的數字所取代? – Aseel

+0

如果你執行'alert(functions)',你只會看到該函數的文本。但是如果你使用'console.log(函數)'並打開你的開發工具,你可以深入瞭解每個函數,一些瀏覽器會向你展示閉包(適用於我的Chrome)。所以你可以看到函數包含的數字(如0,1或2)。 –

+0

非常感謝,這是豐富的。 – Aseel