当前位置:婀娜女性网>美好生活>心理>

let块级作用域咋理解

心理 阅读(1.65W)
let块级作用域咋理解

不会变量提升

因此用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声明每次迭代都会创建一个新变量,并以之前迭代中的同名变量的值将其初始化