1、let关键字声明的变量,只在块中有效
2、let可以提供闭包,并防止循环变量的泄露
3、for特例,小括号是一个独立的作用域,大括号是一个独立的作用域
for(let i = 0; i < 3; i++){
let i = 3;
console.log(i);
}
4、let不能变量提升
暂时性死区:let不进行变量提升, 它会绑定到一个块作用域上。从块作用域的头部到let声明之间的范围(TDS: temporal dead zone)。
变量提升:var在预编译时将变量产生, 只是数值没有初始化,所以可以访问。
绑定:let在预编译的时候变量产生,但在let声明以前,不许使用。
5、不允许在同一个作用域内重复定义
6、解决了两种不合理的现象
// 块内的变量影响到块外
var a = 5;
function f(){
console.log(a);
if(true){
var a = 3;
}
}
f();
// 循环变量的泄露
for(var i = 0; i < 5; i++){
}
console.log(i);
7、立即执行函数和可以简化为一对大括号
(function(){
var tmp = 5;
})();
{
let tmp = 5;
}
console.log(tmp);
8、let声明的变量:内层可以访问外层的变量,外层不能访问内层的变量,内层退出后失效
9、块级作用域中的函数声明
ES5: 不允许在块结构中声明函数的
ES6: 1. 允许在块结构中声明函数的
2. 函数依然有预编译,函数名会提升到全局作用域或者函数作用域的头部
3. 如果在块级作用域,会提升到块的头部