我们知道,对于所有的变量,无论在函数体的什么地方声明,都会在后台被提升到函数体顶部。
这个规则对于函数同样适用,其原因在于函数只是分配给变量的对象。唯一需要引起注意的地方在于当适用函数声明时,函数定义也会被提升,而不仅仅是函数声明被提升。看下面的代码:
function test() {
console.log(typeof foo); // "function"
console.log(typeof bar); // "undefined"
function foo() {
}
var bar = function () {
};
}
test();
test()
函数中的foo
和bar
的声明被提升到了顶部;同时,需要注意的是:foo
和bar
的区别在于前者的定义得到了提升,而后者的定义没有提升,这也就是console.log(typeof bar)
输出undefined
的原因。
所以,需要记住的是:函数表达式仅仅是变量被提升,而函数的实现没有被提升。
上面的代码中,后台解析的代码类似于:
function test() {
var bar;
function foo() {
}
console.log(typeof foo); // "function"
console.log(typeof bar); // "undefined"
var bar = function () {
};
}
test();