《ES6标准入门》读书笔记 第2章

第2章 - let和const

let

ES6新增的let声明的变量只在所在代码块有效。其特点还有:

  • 不发生变量提升(hoist)

  • 暂时性死区(TDZ)

    块内使用let声明的变量在还没有声明前使用会报错

    var tmp = 123
    if (true) {
    	tmp = 456 // ReferenceError!
      let tmp
      tmp = 789 // Okay~
    }
    
  • 禁止重复声明

    function () {
      let a // or `var a`
      let a // already declared...
    }
    

块级作用域

ES5中,只有全局作用域和函数作用域,这带来两个问题:

  • 内层覆盖外层

    var tmp = 1
    function f() {
      console.log(tmp)
      if (false) {
        var tmp = 2 // 在函数作用域中发生了提升
      }
    }
    f() // undefined
    
  • 循环计数变量泄漏

    for (var i = 0; i < 10; i++) { /* do something... */ }
    console.log(i) // 11
    

ES6新增了块级作用域,一个块就是一个大括号括起的区域。

function f() {
  let n = 5
  if (true) {
    let n = 10 // 块内独立
  }
  console.log(n) // 5
}

const

const用于声明常量。必须立即初始化;不发生提升;存在暂时性死区。

const实际上只保证“指向”不变,不保证指向的内容不变。例如const a = {}; a.x = 1;是允许的,但是a = 1是禁止的。

如果要禁止对象的修改,可以使用Object.freeze(obj)方法来冻结。

顶层对象

  • 浏览器下,最外层的var声明变量会全部绑到window上,但let、const不会
  • Node的顶层对象是global
原文地址:https://www.cnblogs.com/zxuuu/p/12707364.html