let 和 const 命令
1.let 命令
基本用法
-
let用法类似于var,但只在它所声明的代码块内有效
- 循环时JavaScript 引擎内部会记住上一轮循环的值,初始化本轮的变量i时,就在上一轮循环的基础上进行计算
- for循环还有一个特别之处,就是设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域
let不存在变量提升
- 声明的变量一定要在声明后使用,否则报错。
暂时性死区
-
只要块级作用域内,存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错,称之为“暂时性死区”。
- 在死区中运行 typeof 时会抛出一个ReferenceError
不允许重复声明
- 不允许在相同作用域内,重复声明同一个变量;不能在函数内部重新声明参数
2.块级作用域
为什么需要块级作用域
- 内层变量可能会覆盖外层变量
- 用来计数的循环变量泄露为全局变量
ES6 的块级作用域
- 允许块级作用域的任意嵌套
- 使得匿名立即执行函数表达式(匿名 IIFE)不再必要了
块级作用域与函数声明
-
允许在块级作用域之中声明函数,行为类似于let,在块级作用域之外不可引用
- 应该避免在块级作用域内声明函数,如果确实需要,也应该写成函数表达式,而不是函数声明语句,即{let f = function(){}}
- 块级作用域必须有大括号,如果没有大括号,JavaScript 引擎就认为不存在块级作用域
3.const 命令
基本用法
-
const声明一个只读的常量,一旦声明就不能改变
- 声明变量时,就必须立即初始化,不能留到以后赋值;只声明不赋值,就会报错
- 作用域与let命令相同:只在声明所在的块级作用域内有效
- 声明的常量也是不提升,同样存在暂时性死区
- 与let一样不可重复声明
本质
-
const实际上保证的是变量指向的内存地址不变
-
对于简单类型的数据(数值、字符串、布尔值),值保存在栈内存,因此等同于常量
-
但对于复合类型的数据(主要是对象和数组),变量保存的是指向该对象的内存地址,所指向的对象数据结构是可变的
- 想将对象冻结,应该使用Object.freeze方法
-
ES6 声明变量的六种方法
- var 和 function 命令
- let 和 const 命令
- import 和 class 命令
4. 顶层对象的属性
浏览器环境指的是window对象,在 Node 指的是global对象
- var命令和function命令声明的全局变量,依旧是顶层对象的属性
- let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性
5. globalThis 对象
顶层对象在各种实现环境里面是不统一的
- 浏览器里面,顶层对象是window
- 浏览器和 Web Worker 里面,self也指向顶层对象
- Node 里面,顶层对象是global
ES2020 在语言标准的层面,引入globalThis作为顶层对象。也就是说,任何环境下,globalThis都是存在的,都可以从它拿到顶层对象,指向全局环境下的this。
思维导图
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!