let是es6时新增的命令,它的作用类似var但也有所不同:
1.let声明的变量不会挂在window中,不会造成全局变量的污染
var a1 = 10;
let a2 = 20
console.log(window);
window上并没有a2说明let声明的变量不会挂在window中
2.新增了一个块级作用域{},以前只有函数作用域,全局作用域
{
let a = 10;
var b = 20;
}
a // ReferenceError: a is not defined.
b // 1
es6新增了一个块级作用域;是以{ }为边界的在花括号之外无法调用;
3.let是不允许重复声明
let a = 10;
let a = 20;
//报错
4.let不会有声明提前(只是人为看到的效果,实际上是有声明提前,提前到临时性的死区中)
在var中会有一个声明提前的效果,就是:
console.log(a);//undefined
var a = 10
这也就是说这段代码等同于
var a
console.log(a);
a = 10
但是在es6中这种特性没有了,
console.log(a);//报错
let a = 10
ES6 规定暂时性死区和let、const语句不出现变量提升,主要是为了减少运行时错误,防止在变量声明前就使用这个变量,从而导致意料之外的行为。这样的错误在 ES5 是很常见的,现在有了这种规定,避免此类错误就很容易了
注意:因为let const不挂载在windows上,所以,不用有一个遍历原型链的操作,对性能的优化是有一定的提升的。
然后还有一个不成文的传言,官方并没有证实的一个说法,因为const的引用地址不能改变,所以系统不需要分性能监视这个变量。没被证实过,所以看自己,但还是能用const就尽量用const。