![大前端三剑客: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=1739379027-mu9KOZvAoiQ8Rg01KfedE3CSJ0jg4Z9W-0-1a5ad4ed27f9a8555a58fafde5411b19)
不能重复声明,let只能声明一次,但var可以声明多次,如代码示例2-3所示。
代码示例2-3
![](https://epubservercos.yuewen.com/467996/26580996409099006/epubprivate/OEBPS/Images/Figure-P29_1214.jpg?sign=1739379027-06Yd9NUVtwmSdwE1jnK2Di5QOpk34FQd-0-7400af84ea0b44092c1f99f1e3ddb41f)
for循环计数器很适合用let声明,如代码示例2-4所示。
代码示例2-4
![](https://epubservercos.yuewen.com/467996/26580996409099006/epubprivate/OEBPS/Images/Figure-P29_1222.jpg?sign=1739379027-5CKOVYMdLHKR1v1cHdAvf4qpqO0CzLnL-0-2eb9d18e9cbe7b18fcc7012f3908d77f)
2.const
const用于声明一个只读的常量。声明后,常量的值就不能改变了,但const声明的对象可以有属性变化,如代码示例2-5所示。
代码示例2-5
![](https://epubservercos.yuewen.com/467996/26580996409099006/epubprivate/OEBPS/Images/Figure-P30_1245.jpg?sign=1739379027-nfLXRSuOseUtSj0nEhIo5gPixv4KRdJE-0-e5e74f43be9df06c93ac226e6bf585be)
也可以使用Object.freeze将对象冻结,如代码示例2-6所示。
代码示例2-6
![](https://epubservercos.yuewen.com/467996/26580996409099006/epubprivate/OEBPS/Images/Figure-P30_1253.jpg?sign=1739379027-O3sRSwYBJ9ffXExASsdKTqz2GJlfkWHk-0-eb8ad3b8679e65474e47781015339cbd)
当去改变用const声明的常量时,如代码示例2-7所示,浏览器就会报错。
代码示例2-7
![](https://epubservercos.yuewen.com/467996/26580996409099006/epubprivate/OEBPS/Images/Figure-P30_1261.jpg?sign=1739379027-QIBTQyzxQYGAoYBFiWkkFMRYC8cZCmbZ-0-d49fa67fdab0f842feaf77d11144b819)
const有一个很好的应用场景,就是当引用第三方库的时候声明变量,用const声明可以避免未来不小心重命名而导致出现Bug,如代码示例2-8所示。
代码示例2-8
![](https://epubservercos.yuewen.com/467996/26580996409099006/epubprivate/OEBPS/Images/Figure-P30_1269.jpg?sign=1739379027-aPcvKtCXo888Z1IoXKFE81g7FZ1ptbxV-0-816d77fe045ec983d90a2dd18141ac07)
使用let和const的规则如下:
(1)变量只在声明所在的块级作用域内有效。
(2)变量声明后方可使用(暂时性死区)。
(3)不能重复定义变量。
(4)声明的全局变量不属于全局对象的属性。
变量声明关键字对比,如表2-1所示。
表2-1 变量声明关键字对比
![](https://epubservercos.yuewen.com/467996/26580996409099006/epubprivate/OEBPS/Images/Figure-T31_1384.jpg?sign=1739379027-ZyBil9FDIB72vomVcfSlbDZyTBbwKBLz-0-704d022fe6cac1df569e1b702a863696)