let、var和const的比较,以及块级作用域
- let和const是es6新增的用于声明变量的命令。
- let和const所声明的变量(常量)只在其所在的作用域内有效。
- let和const 不存在变量提升。变量必须在声明之后才能使用,否则报错。即存在暂时性死区。暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。
- 在同一个作用域内,let和const不允许重复声明。
- const主要是用来声明常量,本质是声明变量所指向的内存地址不可改变。对于简单类型的数据(字符串,数值,布尔值),值就保存在变量所指向的内存地址,因此等同于常量;而对于对象或数组,变量所指向的内存地址,保存的只是一个指向实际数据的指针,这个指针是不变的,但是指针所指向的数据结构是可以改变的。
2.块级作用域 {}
- es6中出现了块级作用域,块级作用域可以嵌套,内层作用域可以定义外层作用域的同名变量,而es5中只有全局作用域和函数作用域(缺陷:1.内层变量可能会覆盖外层变量,变量提升的原因导致;2.用来计数的循环变量泄露为全局变量)。
- es5规定函数只能在顶层作用域和函数作用域中声明,不能在块级作用域声明。 es6允许在块级作用域中声明函数,类似于var声明的变量。
-
es5
中通过var
和function
声明变量,es6
中除了用let
和const
声明变量,还有import
命令和class
命令。 -
es5中的顶层对象的属性和全局变量的赋值是等价的。(缺陷很多)
es6中规定,var
和function
命令声明的全局变量依旧是顶层对象的属性,但let、const、class
命令声明的全局变量不在属于顶层对象的属性。 -
顶层对象,其在各种实现里面是不统一的。
浏览器里的顶层对象是window
node里面的顶层对象是global
全局环境中,this
会返回顶层对象。但是,Node.js
模块中this
返回的是当前模块,ES6 模块中this
返回的是undefined
。
ES2020引入globalThis
作为顶层对象,在任何环境下,globalThis
都是存在的,指向全局环境下的this。