let、var和const的比较以及块级作用域,顶层对象

let、var和const的比较,以及块级作用域

  • let和const是es6新增的用于声明变量的命令。
  • let和const所声明的变量(常量)只在其所在的作用域内有效。
  • let和const 不存在变量提升。变量必须在声明之后才能使用,否则报错。即存在暂时性死区。暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。
  • 在同一个作用域内,let和const不允许重复声明。
  • const主要是用来声明常量,本质是声明变量所指向的内存地址不可改变。对于简单类型的数据(字符串,数值,布尔值),值就保存在变量所指向的内存地址,因此等同于常量;而对于对象或数组,变量所指向的内存地址,保存的只是一个指向实际数据的指针,这个指针是不变的,但是指针所指向的数据结构是可以改变的。

2.块级作用域 {}

  • es6中出现了块级作用域,块级作用域可以嵌套,内层作用域可以定义外层作用域的同名变量,而es5中只有全局作用域和函数作用域(缺陷:1.内层变量可能会覆盖外层变量,变量提升的原因导致;2.用来计数的循环变量泄露为全局变量)。
  • es5规定函数只能在顶层作用域和函数作用域中声明,不能在块级作用域声明。 es6允许在块级作用域中声明函数,类似于var声明的变量。
  1. es5中通过varfunction声明变量,es6中除了用letconst声明变量,还有import命令和class命令。

  2. es5中的顶层对象的属性和全局变量的赋值是等价的。(缺陷很多)
    es6中规定,varfunction命令声明的全局变量依旧是顶层对象的属性,但let、const、class命令声明的全局变量不在属于顶层对象的属性。

  3. 顶层对象,其在各种实现里面是不统一的。
    浏览器里的顶层对象是 window
    node里面的顶层对象是global

全局环境中,this会返回顶层对象。但是,Node.js 模块中this返回的是当前模块,ES6 模块中this返回的是undefined

ES2020引入globalThis作为顶层对象,在任何环境下,globalThis都是存在的,指向全局环境下的this。

猜你喜欢

转载自blog.csdn.net/weixin_42123213/article/details/111939582