I-第4章 提升
编译器在编译代码时是从上到下一行行编译的吗?
引擎会在执行 JavaScript 代码之前先对其进行编译。编译阶段中的一部分工作就是找到所有的声明,并用合适的作用域将它们关联起来。
变量和函数声明从它们在代码中出现的位置被“移动”到了最上面。这个过程就叫作提升。
注意:函数声明会被提升,包括函数表达式的赋值在内的赋值操作并不会提升。
函数会首先被提升,然后才是变量。
后面的函数声明可以覆盖前面的,如下输出3
foo(); // 1
var foo;
function foo() {
console.log( 1 );
}
// 函数表达式不会提升
foo = function() {
console.log( 2 );
};
function foo() {
console.log( 3 );
}
这个代码被引擎解析如下:
function foo() {
console.log( 1 );
}
function foo() {
console.log( 3 );
}
foo(); // 3
foo = function() {
console.log( 2 );
};
要注意避免重复声明,特别是当普通的 var 声明和函数声明混合在一起的时候,否则会引起很多危险的问题!
用let和const可以解决重复声明的问题。