引入let关键字
首先看一段代码:
var foo = true;
if (foo) {
var bar = boo * 2;
bar = something(bar);
console.log(bar);
}
与C++和Java之类的语言不同,if块中的变量bar并不会随着if结束消亡,var关键字在这里声明了一个全局变量,为了解决这个问题ES6引入了let关键字。
var foo = true;
if (foo) {
let bar = boo * 2; // use let here
bar = something(bar);
console.log(bar);
}
引入const关键字
const和let关键字引入的原因相仿,区别是const创建的值是固定的,任何修改他的操作都是非法的。
var foo = true;
if (foo) {
var a = 2;
const b = 3;
a = 3; // 可以
b = 4; // 不可以
}
关于块作用域
简单理解,一般来说 { ... } 这样的括号就会生成一个块作用域气泡,但JavaScript中的if和for并不会这样。
在ES3中使用try/catch结构会生成块作用域,在ES6才引入了let和const关键字来解决这个问题。
需要注意的是这个和函数闭包的概念需要区分开。