第一类函数是否意味着它们表现为变量?显然,它们的行为并不像变量,因为:
console.log(foo);
var foo = 'bar';
...不起作用,而这个:
console.log(foo());
function foo() {
return('bar');
}
...确实
那说,这个:
console.log(foo());
var foo = function() { return 'bar'; };
不起作用,这更加一致。
是什么给出了?
答案 0 :(得分:18)
您所遇到的事情称为吊装。使用函数声明时:
function foo() {}
foo
将移至最近的范围(函数)的顶部。
另一方面,当您使用函数表达式或函数赋值时:
var foo = function() {}
变量foo
将移至顶部,但在需要时将进行分配。
<强> Learn more 强>
答案 1 :(得分:10)
因为你没有比较同样的事情。在您的示例中 - 您将函数声明 function foo()...
与var foo = 'bar';
更正确的比较是:
console.log(foo);
var foo = 'bar';
带
console.log(foo());
var foo = function() {
return 'bar';
}
由于提升的工作原理,功能声明的解释方式不同。提升将所有声明移至最近范围的顶部,,同时保留作业。
在这个意义上,函数声明是特殊的,因为它在一个语句中都是声明和表达/赋值,因此一起被提升。
作为一个例子:您可以查看以下表达式:
console.log(foo);
var foo = 'bar';
这样:
var foo;
console.log(foo); //prints undefined
foo = 'bar';
和
console.log(foo());
var foo = function() {
return 'bar';
}
这样:
var foo;
console.log(foo());
foo = function() {
return 'bar';
}
答案 2 :(得分:6)
函数声明自动碰到JS
中的范围顶部console.log(foo());
function foo() {
return('bar');
}
实际上被解释为
function foo() {
return('bar');
}
console.log(foo());
第二位代码正在以这种方式工作,因为foo是变量,而不是函数(它恰好有一个匿名函数作为值)。变量也会碰到顶部,所以
console.log(foo());
var foo = function() { return 'bar'; };
变为
var foo; //empty variable
console.log(foo()); //undefined
foo = function() { return 'bar'; }; //creates a function without name and assigns it to foo
答案 3 :(得分:4)
函数声明和变量声明将始终移动到其作用域的顶部。
console.log(foo());
function foo() {
return 'bar';
}
被解释为:
function foo() {
return 'bar';
}
console.log(foo());
console.log(foo());
var foo = function () {
return 'bar';
};
被解释为:
var foo;
console.log(foo());
foo = function () {
return 'bar';
};