let var

117 阅读1分钟

let声明和var声明的区别


关于声明提升

var声明

<script>
  console.log(num);
  var num = 10;
  // ==
  var num;
  console.log(num);
  num = 10;
</script>

这时相当于只是把定义提升到前面,但没有初始化完成,会显示undefined

let声明

<script>
  console.log(num);
  let num = 10;
</script>

如果是let就直接报错了,因为let在声明之前就执行会进入"暂时性死区",系统就会反馈成"ReferenceRrror"

关于for循环

var声明

<script>
  for (var i = 0; i < 5; i++) {
    //循环逻辑
  }
  console.log(i); //5
</script>
<script>
  for (var i = 0; i < 5; i++) {
    setTimeout(() => console.log(i), 0);
  }
  //输出 5,5,5,5,5
</script>

for循环定义的迭代变量会渗透到循环体外部;

<script>
  for (let i = 0; i < 5; i++) {
    //循环逻辑
  }
  console.log(i); //i undefined
</script>
<script>
  for (let i = 0; i < 5; i++) {
    setTimeout(() => console.log(i), 0);
  }
  //输出 0,1,2,3,4
</script>

改用let之后,这个问题就消失了,因为迭代变量的作用域仅限于for循环的内部;