所有变量声明都在范围的顶部悬挂,所有函数定义也在范围的顶部悬挂起来。因此
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