所有變量聲明都在範圍的頂部懸掛,所有函數定義也在範圍的頂部懸掛起來。因此
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
。
請問爲什麼是反面投票?你能解釋爲什麼我可以改進嗎? – user781486
[爲什麼使用命名函數表達式?](http://stackoverflow.com/questions/15336347/why-use-named-function-expressions) – vaultah
例如,如果您希望foo根據配置或環境。 – webduvet