变量提升
Q:是什么?
- A:函数及变量的声明都将被提升到函数的最顶部。变量可以在使用后声明,也就是变量可以先使用再声明。
Q:什么情况下变量无法提升?
-
A:变量初始化时,不会提升
console.log(y)//undefined
var y = 7; // 初始化 y
Q:为什么会出现变量提升?
- A:
- js和其他语言一样,都要经历编译和执行阶段。
- 在编译阶段的时候,会搜集所有的变量声明并且提前声明变量,而不会改变其他语句的顺序。
- 因此,在编译阶段的时候,第一步就已经执行了,而第二步则是在执行阶段执行到该语句的时候才执行。
临死性死区
Q:是什么?
-
A:在
let
和const
做变量提升时,已经声明了,可是在没有到它赋值的时候,其他声明都不能使用这个变量,不然就会报错。var a = 2;
function test() {
//报错,原因:let声明出现临时性死区,
//即便外部已经声明a,但是不能使用这个变量
console.log(a); //ReferenceError
let a = 5;
}
test();
变量
Q:变量的生命周期是什么?
- A:
- 声明(Declaration phase)
- 在作用域中注册变量
- 初始化(Initialization phase)
- 负责为变量分配内存并且创建作用域绑定,此时变量会被初始化为 undefined
- 赋值(Assignment phase)
- 将开发者指定的值分配给该变量。
- 声明(Declaration phase)