ES6笔记 -- 变量/语句声明

关于变量声明

  • let的作用是声明一个作用域为某个代码块({})的变量(称为块级作用域)
  • let不允许变量提升(注: 变量的使用在声明之前)
  • 块级作用域里的let命令之前的区域称之为'暂时性死区', 这意味着死区内即使是typeof操作也会出错
  • let不允许在相同的作用域内重复声明同一个变量, 值得一提的是, for循环语句的循环体是独立的子作用域, 而循环语句部分(括号内语句)是其父作用域, 这意味着循环语句和循环体内可以定义相同名称的变量

关于函数声明

function f () { console.log('outside') }

(function () {
  if (false) { function f () { console.log('inside') } }
  f() // inside
}())
  • ES5 中的函数声明只允许在全局或函数作用域内, 但是浏览器为了兼容旧代码, 允许在犹如if的代码块内声明, 此时, 函数将会被提升到函数头部, 相当于
  function f () { console.log('outside') }
  
  (function () {
    function f () { console.log('inside') }
    if (false) { }
    f() // inside
  }())
  
  • 而在 ES6 中则相当于(暂时不提原因)
  function f () { console.log('outside') }
  
  (function () {
    var f = undefined
    if (false) { function f () { console.log('inside') } }
    f() // error
  }())
  • 要想 ES6 在块作用域内声明函数需使用let声明函数表达式, 如
  {
    if (false) {
      let f = function () {}
    }
  }
  
  // 注意, 代码块必须在大括号内
  if (false) let f = function () {} //error

关于常量声明

  • 使用const命令声明一个只读的常量, 一旦声明, 常量的值就不能改变
  • 由于常量不能改变, 所以在声明时必须初始化
  • const命令也存在块级作用域
  • const命令声明的常量也存在暂时性死区
  • const命令声明的常量同样不能重复声明
  • 声明对象/数组常量时, 需要注意的是, 对象的指针地址不能改变(即该常量不能指向新的对象), 但是其对象本身是可以改变的, 如添加和删除属性,如果要将对象冻结, 则使用Object.freeze方法, 对象本身和属性都被冻结

顶层对象与全局变量

  • 浏览器环境下, 顶层对象是window, node 中顶层对象是global对象.
  • ES5 中, 顶层对象和全局变量是等价的, 这种情况下, 会出现很多问题, 比如顶层对象的属性导出可以读写, 这不利于模块化编程.
  • ES6 规定 let, const, class命令声明的全局变量不再等于顶层对象
  • ES5 顶层对象还存在一个问题, 由于各种环境中(浏览器, Web Woker, Node等)的顶层对象不统一, 而使用this变量又存在局限性(如Node和ES6模块中, this返回的是当前模块), 在想取得顶层对象时需要添加判断条件(这里不赘述)
posted @ 2019-01-15 19:53  xvvx  阅读(178)  评论(0编辑  收藏  举报