![大前端三剑客:Vue+React+Flutter](https://wfqqreader-1252317822.image.myqcloud.com/cover/145/47216145/b_47216145.jpg)
上QQ阅读APP看书,第一时间看更新
2.3 let和const
ES5没有块级作用域,只有全局作用域和函数作用域,由于一旦进入函数就要马上将它创建出来,这就造成了所谓的变量提升。
由于ES6是向后兼容的,所以var创建的变量其作用域依旧是全局作用域和函数作用域。这样,即使拥有了块级作用域,也无法解决ES5的“变量提升”问题,所以这里ES6新增了两个新关键词:let和const。
1.let
let声明的变量只在let命令所在的代码块内有效,let不存在变量提升,但var存在变量提升,如代码示例2-2所示。
代码示例2-2
![](https://epubservercos.yuewen.com/467996/26580996409099006/epubprivate/OEBPS/Images/Figure-P29_1206.jpg?sign=1739370040-34CNlpgLZFNlGwria0A22cLfebfBzNr8-0-f825aad54db17cf13ba0671581eaa21d)
不能重复声明,let只能声明一次,但var可以声明多次,如代码示例2-3所示。
代码示例2-3
![](https://epubservercos.yuewen.com/467996/26580996409099006/epubprivate/OEBPS/Images/Figure-P29_1214.jpg?sign=1739370040-LgpI5Y5ITSXRjVw2oX2WHLr0pSdPCD20-0-3682438e5bfe92470bf58f8a75860a84)
for循环计数器很适合用let声明,如代码示例2-4所示。
代码示例2-4
![](https://epubservercos.yuewen.com/467996/26580996409099006/epubprivate/OEBPS/Images/Figure-P29_1222.jpg?sign=1739370040-cXj5ooiecNKMp0wyUrH57vO7W3VdHgt2-0-111690449fed53c0b8abfd9a406d3e36)
2.const
const用于声明一个只读的常量。声明后,常量的值就不能改变了,但const声明的对象可以有属性变化,如代码示例2-5所示。
代码示例2-5
![](https://epubservercos.yuewen.com/467996/26580996409099006/epubprivate/OEBPS/Images/Figure-P30_1245.jpg?sign=1739370040-IXzot1dr3w8pDG24uZOAvBTEuXMj0ib9-0-5cd0218700a0229b2e33bb72fa2a1975)
也可以使用Object.freeze将对象冻结,如代码示例2-6所示。
代码示例2-6
![](https://epubservercos.yuewen.com/467996/26580996409099006/epubprivate/OEBPS/Images/Figure-P30_1253.jpg?sign=1739370040-3mm3tHpvSsL4rK4HAQRME6hJmtSu90z0-0-5bc5f90e23d5c721f2291b3453fdfd9a)
当去改变用const声明的常量时,如代码示例2-7所示,浏览器就会报错。
代码示例2-7
![](https://epubservercos.yuewen.com/467996/26580996409099006/epubprivate/OEBPS/Images/Figure-P30_1261.jpg?sign=1739370040-ZiliFnN7KlghJ6nAAVovCN4A0EhhTvHM-0-07d1a955c66fd976fefe561afa8a6182)
const有一个很好的应用场景,就是当引用第三方库的时候声明变量,用const声明可以避免未来不小心重命名而导致出现Bug,如代码示例2-8所示。
代码示例2-8
![](https://epubservercos.yuewen.com/467996/26580996409099006/epubprivate/OEBPS/Images/Figure-P30_1269.jpg?sign=1739370040-l79G9vo7RsQMne5Y5dw8RYTzS3ecjonW-0-3c1febf54b19249792d8580497dbb5f7)
使用let和const的规则如下:
(1)变量只在声明所在的块级作用域内有效。
(2)变量声明后方可使用(暂时性死区)。
(3)不能重复定义变量。
(4)声明的全局变量不属于全局对象的属性。
变量声明关键字对比,如表2-1所示。
表2-1 变量声明关键字对比
![](https://epubservercos.yuewen.com/467996/26580996409099006/epubprivate/OEBPS/Images/Figure-T31_1384.jpg?sign=1739370040-mpMbSM71lTr1QoX9jgrlGfzBnPVhkk9V-0-01fc4690ffe76c32e51b51011d27f6f3)