总所周知,在 ES6 之前,只有两种声明变量的方式,分别是:var 命令和 function 命令。ES6 新增了四种声明变量的方式,分别是 let ,const ,import 和 class 命令。
1、首先我们来看一下 var 命令,var 命令有那些特点呢?
- 存在变量提升 (可以先使用,后声明)
-
未声明的情况下,直接使用会报错

-
使用 var 命令声明的情况(先使用后声明,不会报错,只会输出 undefined):

-
为什么会存在变量提升?
- 首先我们要知道,Js 在拿到 变量 和 函数时,会有两步操作:解析 与执行。
- 在解析阶段,Js 会检查语法,会对函数进行预编译,在预编译的时候,会将 var 声明命令的代码全部提至最上面先进行声明,用代码来理解的话 如下:

- 执行阶段没什么好讲的,就是逐条解释每条语句并执行
- 至于为什么要进行变量提升,还有变量提升的优点是什么,这里就不细讲了。想了解的小伙伴可以自行百度~
-
在浏览器中会声明成 window 对象的属性。

-
在代码中存在于 function 代码块中(此处使用 es6 的模版字符串)

-
- 可重复声明

2、 let 命令 和 const 命令的共同点
-
不存在变量提升(其实存在,后文会说)
- let 和 const 不存在变量提升。


- let 和 const 不存在变量提升。
-
作用域为块级作用域
- 在es6之后才有块级作用域这一说,可以理解为:一个 { } 之内。


- 在es6之后才有块级作用域这一说,可以理解为:一个 { } 之内。
-
暂时性死区
- ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。总之,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。

- ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。总之,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。
-
不可重复声明
- 在同一个作用域中,let 和 const 是不允许同一个变量名重复声明的!

- 在同一个作用域中,let 和 const 是不允许同一个变量名重复声明的!
3、const 命令的独立特点 (const 是 常量)
- 值不可改变(注意,引用类型只能保证栈区的地址不变,不能保证堆区存放的数据不被改变)

课外题点:
typeof 这个判断类型,在 es6 没出之前是绝对安全的,因为如果不用命令声明的变量在以前默认是 var 命令 默认值为 undefined,所以永不会报错,但是现在因为 let 和 const 的暂时性死区问题,已经变得不安全了、

觉得有点卵用就给个赞吧 QAQ
本文介绍了ES6中新增的变量声明方式,包括let和const,对比了它们与var的区别。var存在变量提升和可重复声明,而let和const则有块级作用域和暂时性死区。const声明的变量值不可改变,且在同一作用域内不可重复声明。此外,还提到了typeof在ES6后的安全性问题。

被折叠的 条评论
为什么被折叠?



