关于javascript:函数语句与函数表达式怪异行为

Function statement vs function expression weird behaviour

1
2
3
4
5
6
var a = function b() {

};

console.log(typeof b); //gives undefined
console.log(typeof a); //gives function

为什么两个输出的差异?

我理解函数表达式和函数语句之间的区别,但无法理解上面的输出。

据我所知,javascript使var a指向这里分配给命名函数b的内存。在这种情况下,typeof b也应返回function,但它返回undefined

有什么解释吗?


因为命名函数表达式的名称的作用域是该表达式。

1
2
3
4
5
6
7
8
9
var a = function b() {
    console.log(typeof b); //gives function
    console.log(typeof a); //gives function
};

console.log(typeof b); //gives undefined
console.log(typeof a); //gives function

a();


Why the difference in the two outputs?

为一个名为b的函数取一个函数表达式,并将它赋给一个名为a的变量。这意味着a在表达式出现的范围内,但b不在;它只在函数的范围内。(整个功能,包括参数列表;最后一部分只与ES2015+,而不是ES5及更早版本相关:您可以使用b作为默认参数的值。)

您可能期望b在表达式所在的范围内,因为对于函数声明来说,这是正确的:

1
2
3
function b() {
}
console.log(typeof b);

但这只是处理函数声明和函数表达式的不同之处。


1
2
3
function b(){

}

您声明了一个名为b的函数。此语句没有返回值,因此返回值未定义。

要声明匿名函数,必须在声明中省略函数名,如下所示:

1
2
3
function(){

};

这一个只是一个函数文字,您可以将它赋给这样的变量:

1
2
3
var a = function(){

};