ECMAScript之路
1.新增的语言特性涉足甚广, 包括: 模块,类,类继承,私有对象成员,可选类型注释等特性
第1章 块级作用域绑定
1.块级作用域(亦被称为词法作用域) 存在于:
- 函数内部
- 块中, 即{}之间的区域
2.let声明不会被提升(Hoisting)
3.通过const声明的常量必须进行初始化;
与其他语言中的常量不同的是,JavaScript中的常量如果是对象,则对象中的值可以修改.
4.JavaScript引擎在扫描代码发现变量声明时,要么将它们提升至作用域顶部(遇到var声明),要么将声明放大TDZ中(遇到let和const)
注释: TDZ(temporal dead zone),临时死区
栗子一:
if(codition) {
console.log(typeof value); // 引出错误
let value = 'blue';
}
栗子二:
console.log(typeof value);
if(conditon) {
let value = 'blue';
}
5.循环中的块级作用域绑定
- 为解决这个问题, 开发者在循环中使用立即执行函数表达式(IIFE),以强制生成计数器变量的副本
- 使用let声明能够更快速的解决(在for,for-in,for-of循环情况一样,生成变量副本)
- 循环中使用const,普通for会抛出错误(更新循环变量); 在for-in,for-of不会出错,因为每次迭代中不会修改已有绑定,而是会创建一个新绑定
6.全局块作用域绑定
如果不想为全局对象创建属性,则使用let和const要安全很多
var item = 'hello';
console.log(window.item === item); // true
let item = 'hello';
console.log(window.item === item); // false
7.当前使用块级绑定的最佳实践是: 默认使用const, 只在确定需要改变变量的值时使用let