如果JS中的函数是一流的,那么在定义它们之前允许它们被调用的是什么?

时间:2012-09-05 03:13:19

标签: javascript syntax functional-programming first-class-functions

第一类函数是否意味着它们表现为变量?显然,它们的行为并不像变量,因为:

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

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

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

...确实

那说,这个:

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

不起作用,这更加一致。

是什么给出了?

4 个答案:

答案 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';
};