总结
- 只有
声明
本身会被提升,而赋值或其他运行逻辑会被留在原处。 - 函数声明会被提升,函数表达式不会被提升。
- 函数声明首先被提升,然后才是变量。
输出 2
:
a = 2;
var a;
console.log(a);
输出 undefined
:
console.log(a);
var a = 2;
输出 2
:
foo();
function foo() {
console.log(2);
}
抛出 TypeError
异常:
foo();
var foo = function () {
//...
}
输出 1
:
foo();
var foo;
function foo() {
console.log(1);
}
foo = function () {
console.log(2);
}
尽管 var foo
在 function foo()
之前,但是函数声明会被提升到普通变量之前,最终代码被引擎理解为:
function foo() {
console.log(1);
}
var foo;
foo();
foo = function () {
console.log(2);
}
如果后面再次调用 foo()
,函数声明就会被函数表达式 foo 覆盖。