18

头等函数不是意味着它们表现为变量吗?显然,它们的行为与变量并不完全相同,因为:

console.log(foo);
var foo = 'bar';

...不起作用,而这个:

console.log(foo());
function foo() {
 return('bar');
}

...做。

也就是说,这个:

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

不起作用,这是更一致的。

是什么赋予了?

4

4 回答 4

18

你所经历的被称为提升。当使用如下函数声明时:

function foo() {}

foo将被移动到最近的作用域(函数)的顶部。

另一方面,当您使用函数表达式函数赋值时,例如:

var foo = function() {}

变量foo将被移到顶部,但在需要时会进行赋值。

学到更多

于 2012-09-05T03:18:26.850 回答
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';
}
于 2012-09-05T03:24:05.673 回答
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
于 2012-09-05T03:18:19.860 回答
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';
};
于 2012-09-05T03:24:09.197 回答