ES6 中使用let和const 都可以声明变量, 但是它们与var不同
虽然var可以声明局部变量但是无论在哪里声明都会被当成在当前作用域顶部声明的变量, 这就是提升机制
function getValue(condition){
if(condition){
var value = "blue";
return value;
}else{
return null;
}
}
上面的代码编译后等价于
function getValue(condition){
var value;
if(condition){
value = "blue";
return value;
}else{
return null;
}
}
这个机制通常会导致当condition为true时, 在else块中也可以访问到value变量, 只不过因为它只是通过var value; 声明过并没有进行初始化
所以会得到一个undefined
将上述代码的var替换成let之后, 当condition为true时, else块中是无法访问到value变量的, 离开作用域块之后value会被销毁
同样, let声明的变量不可以重名
const用于声明常量, 一旦声明无法更改, 在声明时必须立即进行初始化
这里实际上和java的final一样, 虽然const声明常量, 但是如果值是一个引用, 你还是可以修改这个引用指向的对象的属性值
Javascript引擎在扫描代码发现变量声明时, 如果遇到var, 就把声明提升到作用域顶部, 如果遇到let或者const, 则会把声明放入临时死区(TDZ, temporal dead zone)