变量

Apr 30, 2019 5:06·463 words ·1 minutes read

var

  • var 的作用域是函数作用域
  • var 不在函数中使用,则作用域是全局作用域
  • 在全局作用域中,使用 var 声明的变量会作为全局对象 window 的属性
  • var 允许在同一作用域中声明同名的变量

let

  • let 的作用域是块作用域
  • let 不在块中使用,则作用域是全局作用域
  • 在全局作用域中,使用 let 声明的变量不会作为全局对象 window 的属性
  • let 不允许在同一作用域中声明同名的变量

const

  • const 一旦声明一个变量,就必须马上初始化

深入理解

  • js引擎在读取js代码时会进行两个步骤:

    • 第一个步骤是解释。
    • 第二个步骤是执行。

      所谓解释就是会先通篇扫描所有的Js代码,然后把所有声明提升到顶端,第二步是执行,执行就是操作一类的。

  • 例子

    • a = 'javascript';
      var a;
      console.log(a);//'javascript'
      
    • console.log(b);//undefined
      var b='javascript'
      
  • 预解析

    • 将 var 和 function 声明提升
      • !注意: 同时声明又定义时,变量不会提升
    • 函数声明直接把整个函数提升到执行环境的最顶层
  • 暂时性死区 (TDZ)

    • 当程序的控制流程在新的作用域(module, function或block作用域)进行实例化时,在此作用域中的用 let/const 声明的变量会先在作用域中被创建出来,但是因为此时还未进行词法绑定,也就是对声明语句进行求值运算,所以是不能被访问的,访问就会抛出错误。因此,在这运行流程一进入作用域创建变量,到变量开始可被访问之间的一段时间,就称为TDZ(暂时死区)。