函数的提升

我们知道,对于所有的变量,无论在函数体的什么地方声明,都会在后台被提升到函数体顶部。

这个规则对于函数同样适用,其原因在于函数只是分配给变量的对象。唯一需要引起注意的地方在于当适用函数声明时,函数定义也会被提升,而不仅仅是函数声明被提升。看下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function test() {
console.log(typeof foo); // "function"
console.log(typeof bar); // "undefined"

function foo() {

}

var bar = function () {

};
}

test();

test()函数中的foobar的声明被提升到了顶部;同时,需要注意的是:foobar的区别在于前者的定义得到了提升,而后者的定义没有提升,这也就是console.log(typeof bar)输出undefined的原因。

所以,需要记住的是:函数表达式仅仅是变量被提升,而函数的实现没有被提升。
上面的代码中,后台解析的代码类似于:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function test() {
var bar;
function foo() {

}
console.log(typeof foo); // "function"
console.log(typeof bar); // "undefined"

var bar = function () {

};
}

test();