何为提升
变量或者函数声明都会在任何代码被执行前首先被处理。
一些代码片段的运行结果
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);
}
说明:在之前对基础上,出现在后面对声明还是可以覆盖前面的