不会变量提升
因此用let代替var声明变量就可以把变量的作用域限制在当前的代码块中
除了在value定义的代码块,也就是condition为true的情况下,value是有值的
执行流离开if块,value立即被销毁,使用value值都会抛出一个引用错误
2、禁止重声明
无论另一个变量是用var还是let声明的
同一作用域中不能用let重复声明已经存在的标识符,否则会抛出一个语法错误
const声明
用来声明一个常量。它有以下特点:
1、不会变量提升
2、禁止重声明
3、值一旦被设定后不可更改
否则抛出语法错误
tips:常量如果是对象,那么对象中的值可以修改
原因:const声明不允许修改绑定,但允许修改值
4、必须初始化
否则抛出语法错误,这是由特点3决定的
四、暂时性死区(Temporal Dead Zone,TDZ)
在let或const声明之前访问这些变量,会抛出引用错误
原理:
JS引擎在扫描代码发现变量声明时,要么将他们提升至作用域顶部(遇到var声明),要么将声明放到TDZ中(遇到let和const声明)。访问TDZ中的变量会触发运行时错误。只有执行过变量声明语句后,变量才会从TDZ中移出,然后才可正常访问。
五、循环中的let声明
同学们应该常常这样写for循环:
由于Hoisting,i的声明提升到函数顶部,导致在循坏外部依旧可以访问到i,输出是10
在没有ES6之前,由于这个特性,我们很难在循环中创建函数,看以下例子:
函数租后会输出10次10,因为,i由于之前for循环里的自增,已经变成了10。在forEach循环的时候,每次迭代都同时共享变量i。
这明显与函数的本意不符!
为了解决这个问题,开发者们使用了立即执行函数(IIFE):
立即执行函数,顾名思义就是在函数定
原理是:let声明每次迭代都会创建一个新变量,并以之前迭代中的同名变量的值将其初始化