众所周知,ES6之前,javascript只有函数作用域。今天我们来聊聊ES6的新特性:块级作用域
var的迷思
ES6之前,声明变量的关键字var,在用var的时候是不是经常出现一些特别的特性,我们来回顾一下
声明提升
function print() {
console.log(value); // undefined
var value = "1";
console.log(value); // 1
}
复制代码
如上例,变量的定义是会提升的,在变量赋值之前使用,不会报错,输出的是undefined。所以前端规范经常会有一条,先赋值后使用,变量的声明一定要在使用之前
无块级作用域,只有函数级作用域
function print(condition) {
if (condition) {
var value = "1";
console.log(value); // 1
}
else {
console.log(value); // undefined
}
}
复制代码重复声明和定义
function print() {
var value = 1;
console.log(value);
// doSometing
var value = "hello";
console.log(value);
}
复制代码无法定义常量
var MAX_NUMBER = 1000;
复制代码
ES6之前定义常量都是使用全部大写的方式标识常量信息,但是这个常量是可以重新赋值的,前端规范中常量使用大写在一方面就是提醒大家在使用的时候注意,大写的是常量不要赋值。
块级作用域
为了解决上述的问题ES6祭出了两个关键词let和const,let替代变量定义,const补充了常量定义
问题1:声明提升
解决方案:TDZ(Temporal Dead Zone),临时死区