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。