何为提升
变量或者函数声明都会在任何代码被执行前首先被处理。
一些代码片段的运行结果
a = 2;
var a;
console.log(a); // 2
说明:对变量a的声明var a会被提升到最顶部。
console.log(a); // undefined
var a = 2;
说明:JS将var a = 2看作两个声明:var a和a = 2。第一个定义声明在编译阶段进行,第二个赋值声明在执行阶段进行。只有定义声明会被提升。
foo();
function foo () {
console.log(a); // undefined
var a = 2;
}
说明:
-
foo的函数声明会被提升,因此第一行foo()可以正常执行 -
var a被提升,赋值操作不会被提升,因此结果是undefined
foo(); // TypeError
var foo = function bar() {
...
}
说明:
- 变量标识符
foo()被提升并分配给所在作用域,因此不会导致ReferenceError - 但是
foo并未赋值,foo()对undefined进行函数调用而导致非法操作,因此抛出TypeError异常 - 函数表达式不会被提升
foo(); // 1
var foo;
function foo() {
console.log(1);
}
foo = function () {
console.log(2);
}
说明:
- 函数声明会被提升到变量声明之前(函数优先)
- 重复 声明会被忽略掉
foo(); // 3
var foo;
function foo() {
console.log(1);
}
foo = function () {
console.log(2);
}
function foo () {
console.log(3);
}
说明:在之前对基础上,出现在后面对声明还是可以覆盖前面的