1

我寧願一直使用函數聲明,因爲我可以將函數放在源文件的任何位置。如果我使用函數表達式,函數必須放在源文件的頂部。使用函數表達式而不是函數聲明有什麼好處?

是否有很好的情況下使用函數表達式而不是函數聲明?

//Function declaration 
function foo() { return 5; } 

//Anonymous function expression 
var foo = function() { return 5; } 
+0

請問爲什麼是反面投票?你能解釋爲什麼我可以改進嗎? – user781486

+5

[爲什麼使用命名函數表達式?](http://stackoverflow.com/questions/15336347/why-use-named-function-expressions) – vaultah

+0

例如,如果您希望foo根據配置或環境。 – webduvet

回答

1

所有變量聲明都在範圍的頂部懸掛,所有函數定義也在範圍的頂部懸掛起來。因此

console(foo()); // prints foo 
function foo(){return 'foo'}; 

console(foo()); // complain foo is not function, it is undefined 
var foo = function(){return 'foo'}; 

第二示例是相同的這一點:

var foo; 
console.log(foo()); 
foo = function(){} 

用於使用第二表達將從編程邏輯乾的原因。例如:

var foo = MY_ENV_VAR ? function(){return true} : function(){return false} 

或運行更好地理解下面的例子:

var bar;                                                 

if (true) { 
    function foo(){return 'foo'}; 
    bar = function(){return 'hey'}; 
} else { 
    function foo(){return 'another'}; 
    bar = function(){return 'bar'}; 
} 
console.log(foo()); 
console.log(bar()); 

第一個日誌將是another,因爲JS的編譯器把該範圍的頂部和第二個聲明函數聲明只是覆蓋第一個。而第二個日誌輸出if語句中分配的函數的結果,該語句將爲hey

相關問題