变量提升
Q:是什么?
- A:函数及变量的声明都将被提升到函数的最顶部。变量可以在使用后声明,也就是变量可以先使用再声明。
Q:什么情况下变量无法提升?
A:变量初始化时,不会提升
javascriptconsole.log(y)//undefined var y = 7; // 初始化 y
Q:为什么会出现变量提升?
- A:
- js和其他语言一样,都要经历编译和执行阶段。
- 在编译阶段的时候,会搜集所有的变量声明并且提前声明变量,而不会改变其他语句的顺序。
- 因此,在编译阶段的时候,第一步就已经执行了,而第二步则是在执行阶段执行到该语句的时候才执行。
临死性死区
Q:是什么?
A:在
let和const做变量提升时,已经声明了,可是在没有到它赋值的时候,其他声明都不能使用这个变量,不然就会报错。javascriptvar 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)