变量提升
提升
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执行前,会经历三个步骤
- 分词/词法分析(将代码组成的字符分成一个个有意义的代码块,词法单元)
- 解析/语法分析(生成抽象语法树)
- 代码生成
在词法分析阶段,js 会检测到当前作用域使用到的所有变量和函数声明,并将这些变量和函数声明添加到一个名为词法环境的内存空间当中。
小结
函数和变量,类声明,都会提升。
提升发生在词法分析阶段,语法抽象树。
函数要比变量先提升。
let,const,暂时性死区