ES6:let 和 const 命令

109 阅读2分钟

let命令

  • 与var类似,声明的变量只在当前代码块有效

    for循环中就很适合用let for循环设置循环变量部分是一个父作用域,循环体内部是子作用域

  • let不存在变量提升

    声明的变量一定要在声明后使用 称为暂时性死区

  • let不允许重复声明

块级作用域

  • ES6存在块级作用域
  • ES6允许函数在块级作用域中声明
  • 对于ES6浏览器,函数声明类似于var,会被提升到全局作用域或函数作用域头部
  • 应避免在块级作用域声明函数,如有需要,则用let写成函数表达式
  • 块级作用域应该有大括号

const命令

  • const声明一个只读常量,不可更改
  • 一旦声明必须立即初始化
  • 只在声明的块级作用域有效
  • 存在暂时性死区

const命令本质

  • 保证变量指向的内存地址所保存的数据不能改动
  • 对于对象和数组,保存的只是一个指向实际数据的指针,const保证这个指针是固定的,指向的数据结构不能保证不变
    const a = [];
    a.push('Hello'); // 可执行
    a.length = 0;    // 可执行
    a = ['Dave'];    // 报错
    

    上面可以不改变a指向数组地址的指针,向数组添加数据,而最后一行代码改变了指针的位置,所以会报错

顶层对象属性

  • ES6用var和function命令声明的全局变量依旧是顶层对象(window)的属性
  • 用let,const,class声明的全局变量不是顶层对象的属性

globalThis对象

  • 浏览器里面顶层对象是window,但node和web worker没有window
  • 浏览器和web worker里面,self也指向顶层对象,node没有self
  • node里面顶层对象是global
  • 全局环境中this返回顶层对象,node和es6模块中,this返回当前模块
  • ES2020 在语言标准的层面,引入globalThis作为顶层对象。也就是说,任何环境下,globalThis都是存在的,都可以从它拿到顶层对象,指向全局环境下的this。