let块级作用域
var name = 'zach' //ES3写法
while (true) {
var name = 'obama'
console.log(name) //obama
break
}
console.log(name) //obama
只有全局作用域和函数作用域,没有块级作用域,这带来很多不合理的场景。
看一下es6
let name = 'zach'
while (true) {
let name = 'obama'
console.log(name) //obama
break
}
console.log(name) //zach
let则实际上为JavaScript新增了块级作用域。用它所声明的变量,只在let命令所在的代码块内有效。
另外一个var带来的不合理场景就是用来计数的循环变量泄露为全局变量,看下面的例子:
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 10
for (let i = 0; i < 10; i++) { //避免了上述问题
a[i] = function () {
console.log(i);
};
}
a[6](); // 6
二、const
const也用来声明变量,但是声明的是常量。一旦声明,常量的值就不能改变。
const PI = Math.PI
PI = 23 //Module build failed: SyntaxError: /es6/app.js: "PI" is read-only
const有一个很好的应用场景,就是当我们引用第三方库的时声明的变量,用const来声明可以避免未来不小心重命名而导致出现bug:例如:
const monent = require('moment')