PCDotFan

To be an life & code artisan

你不知道的 JavaScript - 提升

JavaScript 0 评

「提升」一词经常和 ES5 的「var」联系在一起,但实际上 YDKJS 告诉了我更多有关提升的故事……Mark 一下。

「提升」:意味着无论作用域中的声明出现在什么地方,都将在代码本身被执行前首先进行处理。可以将这个过程形象地想象成所有的声明(变量和函数)都会被“移动”到各自作用域的最顶端,这个过程被称为提升。 ——你不知道的 JavaScript

函数优先

事实上不仅是「var」,函数的声明同样存在提升现象。在变量和函数的字面量相同的情况下,编译器将优先提升函数。如例:

aFunc();
var aFunc = function() {
    console.log('变量被提升');
}
function aFunc() {
    console.log('函数被提升');
}

// 输出结果:函数被提升

根据 YDKJS 上「只有声明本身会被提升,而赋值或其他运行逻辑会留在原地」的说法,以上代码在编译器眼里是这样的:

function aFunc() {
    console.log('函数被提升');
}
aFunc();
var aFunc = function() {
    console.log('变量被提升');
}
// 输出结果:函数被提升

后者优先

「尽管重复的 var 声明会被忽略掉,但出现在后面的函数声明还是可以覆盖前面的。」

有点懒,直接上书里的示例:

foo(); // 3

function foo() {
    console.log( 1 );
}

var foo = function() {
    console.log( 2 );
};

function foo() {
    console.log( 3 );
}