一、let
- 快级作用域
- 不存在变量提升
- 暂时性死区
var num = 10;
if(true){
console.log(num);//内部的num和外部的num是没有关系的
let num = 20;
}
二、经典案例
<script>
var arr = [];
for(var i = 0;i<2;i++){
arr[i] = function(){
console.log(i)
}
}
// 执行下面两个函数的时候,循环体已经早就循环完毕了,再次去调用输出的时候,i只能锁定到全局循环里的i=2,
// 所以输出为2
arr[0](); //2
arr[1](); //2
</script>
<script>
var arr = [];
for(let i = 0;i<2;i++){
arr[i] = function(){
console.log(i)
}
}
arr[0](); //0
arr[1](); //1
// 当改为let变量的时候,这时候产生了两个块级作用域,产生的两个块级作用域都有自己的变量i,互不影响
// 当函数执行时还是没有自己的变量i,所以还要向上一级作用域去寻找,其实就是循环产生的块级作用域i
</script>