1.let命令
ES6 新增了let
命令,用来声明变量。它的用法类似于var
,但是所声明的变量,只在let
命令所在的代码块内有效,for
循环的计数器,就很合适使用let
命令。
不存在变量提升:
- var可以先使用(值为undefined),然后再声明
- let不行,一定要在声明后使用,先使用会报错
暂时性死区:
只要块级作用域内存在let
命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。
不允许重复声明:
let
不允许在相同作用域内,重复声明同一个变量,因此,不能在函数内部重新声明参数。
function func(arg) {
let arg;
}
func() // 报错
function func(arg) {
{
let arg;
}
}
func() // 不报错
2.块级作用域
let
实际上为 JavaScript 新增了块级作用域
- ES6 允许块级作用域的任意嵌套。
- 内层作用域可以定义外层作用域的同名变量。
- 块级作用域的出现,实际上使得获得广泛应用的匿名立即执行函数表达式(匿名 IIFE)不再必要了。
块级作用域与函数声明
- 允许在块级作用域内声明函数。
- 函数声明类似于
var
,即会提升到全局作用域或函数作用域的头部。 - 同时,函数声明还会提升到所在的块级作用域的头部。
let
只能出现在当前作用域的顶层
3.const命令
- 声明一个可读的常量。一旦声明就不可以改变
- 因为一旦声明就不可以改变,所以一旦声明要立马初始化
const
的作用域与let
命令相同:只在声明所在的块级作用域内有效。
本质
- 如果真的想将对象冻结,应该使用
Object.freeze
方法。
ES6 声明变量的六种方法
ES5: var function
ES6:let const import class
4.顶层对象的属性
- 顶层对象,在浏览器环境指的是
window
对象,在 Node 指的是global
对象。ES5 之中,顶层对象的属性与全局变量是等价的。 - 从es6开始,只有var和function命令声明全局变量,let const class声明的全局变量不属于顶层对象属性(不是windows的)
5.globalThis
- 浏览器里面,顶层对象是
window
,但 Node 和 Web Worker 没有window
。 - 浏览器和 Web Worker 里面,
self
也指向顶层对象,但是 Node 没有self
。 - Node 里面,顶层对象是
global
,但其他环境都不支持。 - 任何环境下,
globalThis
都是存在的,都可以从它拿到顶层对象,指向全局环境下的this
。