2017-02-02 84 views
0

下面的作品如預期使用IIFE作爲參數的函數表達式?

var dogName = function animalName(name) { 
    console.log("My name is " + name); 
} 

dogName('Scruffy'); 

(function() { 
    console.log("My name is Fido!"); 
})(); 

如果您註釋掉dogName( '破舊');如果調整IIFE到

(function() { 
    console.log("My name is Fido!"); 
}()); //()) instead of)() 

它輸出該

My name is function() { 
    console.log("My name is Fido!"); 
} 

它輸出

My name is Fido! 
My name is undefined 

爲什麼函數式使用IIFE因爲它的名字變了,爲什麼是IIFE在最後一個例子中的函數表達式之前先執行?

+1

如果您註釋掉包含一個明確的分號的中間線,就成了'功能animalName(名稱){...}(函數...)'...一個IIFE。在'animalName'的定義之後加上';'。 – deceze

+1

相關:['TypeError':'console.log('...')'不是函數](http://stackoverflow.com/q/31013221/4642212)。 – Xufox

回答

4

問題是,你沒有在你的函數表達式的末尾放一個分號。您的代碼基本上解釋爲這樣:

var dogName = function animalName(name) { 
    console.log("My name is " + name); 
}(function() { 
    console.log("My name is Fido!"); 
})(); 

至於解釋可以告訴你傳遞一個函數作爲第一個參數命名函數表達式,然後試圖調用的返回值的函數。

要解決這個問題,只需在表達式末尾加上分號即可。

var dogName = function animalName(name) { 
 
    console.log("My name is " + name); 
 
}; // <-- 
 

 
(function() { 
 
    console.log("My name is Fido!"); 
 
})();

+1

不錯的解釋,謝謝! – Chad

相關問題