let / const 注意事项

  1. 重复声明

    • var 可重复声明
    • let / const 不可重复声明
    var message = 'hello world'
    var message = 'hello world!' // 不报错

    let address = 'beijing'
    let address = 'shanghai' // 报错

    const age = 18
    const age = 19 // 报错
  2. 作用域提升

    console.log(message) // undefined
    var message = 'hello world'

    console.log(address) // 报错
    let address = 'beijing'

    console.log(age) // 报错
    const age = 18

    在创建执行上下文时,词法环境被创建,变量也被创建,但var定义的变量被初始化为undefinedlet/const定义的变量未赋值,访问会报错。

  3. 暂时性死区

    • 变量未被声明之前到作用域顶部,这块区域不能访问变量,会报错(叫做暂时性死区)。
  4. window对象添加属性

    • var定义的变量会添加在window对象上;
    • let/const定义的变量不会添加在window对象上

    在全局语法环境中存在obejct Environment Recorddeclarative Environment Record两个对象,前者是window对象,后者身上添加了letconst声明的变量。

  5. 块级作用域

    • ES6中新增了块级作用域 { ... } ,并且通过letconstfunctionclass声明的标识符是具备块级作用域限制的。
    {
    let message = 'hello world'
    const age = 18
    function foo(){
    console.log(message)
    }
    class Person { }
    }

    上面代码中只有function 可以在外部被访问到,这是因为引擎会对函数的声明进行特殊的处理,允许像var那样可以在外接访问 。