变量提升

168 阅读2分钟

变量提升

提升

JavaScript 提升是指解释器在执行代码之前将函数、变量或类的声明引动到其作用域顶部的过程。

提升允许函数在声明之前安茜地在代码中使用。

变量和类声明也会被提升,因此在声明之前也可以引用它们。

函数提升

允许你在代码中声明函数之前使用该函数。

catName("Chloe");

function catName(name) {
    console.log("我的猫名叫 " + name);
}

// "我的猫名叫 Chloe"

函数和变量相比,会被优先提升。这意味着函数会被提升到更靠前的位置。

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

只有声明被提升

JavaScript 只会提升声明,不会提升其初始化。如果一个变量先被使用再被声明和赋值的话,使用时的值是 undefined。

console.log(num); // Returns undefined
var num;
num = 6;
var x = 1;
console.log(x + " " + y); // "1 undefined"
var y = 2;

var num1 = 3;
num2 = 4;
console.log(num1 + " " + num2); // "3 4"
var num2;

a = "Cran";
b = "berry";
console.log(a + "" + b); // "Cranberry"
var a, b;

类提升

类也会被提升

原理

为什么会被提升

前面写作用域的时候,写过,

javaScirpt执行前,会经历三个步骤

  1. 分词/词法分析(将代码组成的字符分成一个个有意义的代码块,词法单元)
  2. 解析/语法分析(生成抽象语法树)
  3. 代码生成

在词法分析阶段,js 会检测到当前作用域使用到的所有变量和函数声明,并将这些变量和函数声明添加到一个名为词法环境的内存空间当中。

小结

函数和变量,类声明,都会提升。

提升发生在词法分析阶段,语法抽象树。

函数要比变量先提升。

let,const,暂时性死区

引用

towind.fun/2021/05/10/…

developer.mozilla.org/en-US/docs/…