1

纯属个人理解,如有问题还请指出~

在声明的()内存在一个变量 i,会存在 JavaScript 引擎内部。 每一次循环的时候, JavaScript 引擎内部会记住上一轮循环的值,然后将新的 i 的值赋值给 i

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

由于let块级作用域,for()内的let 相当于有个隐藏的父作用域,for{}循环体内的let 是新的子作用域,重新声明一个 i;不会影响()里 i 的值

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

但是如果不声明 i,直接给 i 赋值,会影响()里 i 的值,说明()是循环体的上一级作用域,在循环体里直接改变 i 的值会影响上一级作用域里的 i 值

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

相当于
1 先var i;
2 再执行 for 循环
3 第一次 i = 0 满足条件 进入循环体,由于 var 没有块级作用域的概念,所以会重新声明修改for循环外全局作用域的 i 的值,从而影响了循环变量的值,导致后面条件不满足进入不到循环体,所以只输出一次

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

循环变量 i 是全局作用域,循环体内 let i 为块级作用域内的变量,不影响全局变量,输出三次

for (let i = 0; i < 3; i++) {
  var i = 'abc';
  console.log(i);
}
//Uncaught SyntaxError: Identifier 'i' has already been declared

!!! 不太理解这个为什么会报错,希望懂得的小伙伴们给个指导
个人迷惑的地方:报这个错是因为在同一个作用域下重复声明变量 i,但是{}内的var i 为 全局作用域下的 i ,()内的 let i 属于()的作用域,两个不同的作用域为什么会报错呢???


啊呜
20 声望1 粉丝