SOURCE

//1.let命令  用于声明变量,但声明的变量只在代码块内有效
{
  let a=1;
  var b=2;
}
a;//undefined
b://2

for(let i=0;i<10;i++){
  //在块内才有效
}
console.log(i);

//2.for循环还有一个特别之处,就是设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域

for(let i=0;i<3;i++){
  let i='abc';
   console.log(i);
}
// abc
// abc
// abc

//3.let不存在变量提升
// var 的情况
console.log(foo); // 输出undefined
var foo = 2;

// let 的情况
console.log(bar); // 报错ReferenceError
let bar = 2;
//变量foo用var命令声明,会发生变量提升,即脚本开始运行时,变量foo已经存在了,但是没有值,所以会输出undefined。变量bar用let命令声明,不会发生变量提升。这表示在声明它之前,变量bar是不存在的,这时如果用到它,就会抛出一个错误。

//3.暂时性死区
//只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。
var tmp=123;
if(true){
  tmp='abc';
  let=tmp;
}
console 命令行工具 X clear

                    
>
console