变量声明 let
不属于顶层对象window
var a = 5;
let b = 6;
console.log(window.a);
console.log(window.b);
很简单,由var声明的a是winow的属性,而由let声明的b并不是window的属性,所以let不属于全局对象window。
var声明的变量全部挂载到window上,那window这个变量就会变得越来越大,同样就会引起全局变量污染,ES6中let 就很好的解决了这个问题。
不允许重复声明
let a = 5;
let a = 6
console.log(a);
在 let声明的变量中这样是不允许的,但是如果是由 var声明的变量 就会直接覆盖掉上一个变量的值。
不存在变量提升
console.log(a);
let a = 5
直接会报错 ,但是由var声明时 只会弹出undefined未定义
console.log(a);
var a = 5
//同等于
var a ;
console.log(a);
a = 5;
所以let是不存在变量提升的。
暂时性死区
// 例1
var a = 6666;
if (true) {
a = 5555;
let a
console.log(a);
}
// 例2
function fun(b =a, a = 222) {
console.log(a, b);
}
fun();
这两个例子都是错误的,都存在暂时性死区。
顾名思义 ,暂时性死区就是在作用域内未声明之前就使用这个变量,同理在作用域内let必须先声明再定义,不可以先定义再声明,其本质就是防止在变量声明之前就使用这个变量,使代码更加的安全 。
块级作用域
if (false) {
var a = 555;
}
console.log(a);
由var声明的变量作用域在全局,可查找到这个a,但是获取不到值,输出的只能nudefined,但是将var换成let声明时,就会因为块级作用域的影响下直接报错,它让我们的代码更加的安全 。
每个 { } 都是一个块级作用域。
在ES6中 if 后面只有一条语句是也要写 { }。