Skip to main content

变量提升

Q:是什么?

  • A:函数及变量的声明都将被提升到函数的最顶部。变量可以在使用后声明,也就是变量可以先使用再声明。

Q:什么情况下变量无法提升?

  • A:变量初始化时,不会提升

    console.log(y)//undefined
    var y = 7; // 初始化 y

Q:为什么会出现变量提升?

  • A:
    • js和其他语言一样,都要经历编译和执行阶段。
    • 在编译阶段的时候,会搜集所有的变量声明并且提前声明变量,而不会改变其他语句的顺序。
    • 因此,在编译阶段的时候,第一步就已经执行了,而第二步则是在执行阶段执行到该语句的时候才执行。

临死性死区

Q:是什么?

  • A:在letconst做变量提升时,已经声明了,可是在没有到它赋值的时候,其他声明都不能使用这个变量,不然就会报错。

    var a = 2;
    function test() {
    //报错,原因:let声明出现临时性死区,
    //即便外部已经声明a,但是不能使用这个变量
    console.log(a); //ReferenceError
    let a = 5;
    }
    test();

变量

Q:变量的生命周期是什么?

  • A:
    1. 声明(Declaration phase)
      • 在作用域中注册变量
    2. 初始化(Initialization phase)
      • 负责为变量分配内存并且创建作用域绑定,此时变量会被初始化为 undefined
    3. 赋值(Assignment phase)
      • 将开发者指定的值分配给该变量。