精读《你不知道的JavaScript》上卷-I-第4章提升-JS编译代码是从上到下一行行执行吗

157 阅读1分钟

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 声明和函数声明混合在一起的时候,否则会引起很多危险的问题!

letconst可以解决重复声明的问题。