Javascript Var和Let用法[重复]

问题描述 投票:0回答:1
 const array = [1, 2, 3, 4];
 for (var index = 0; index < array.length; index++) {
  setTimeout(() => {
    console.log("I am at index " + index);
  });
}

当我在for循环中使用 "var "关键字时,我得到的输出为

I am at index 4
I am at index 4
I am at index 4
I am at index 4

但当我在for循环中使用 "let "关键字时。

 const array = [1, 2, 3, 4];
 for (let index = 0; index < array.length; index++) {
  setTimeout(() => {
    console.log("I am at index " + index);
  });
}

I am at index 0
I am at index 1 
I am at index 2
I am at index 3

谁能告诉我这里发生了什么?

javascript arrays var let
1个回答
1
投票

你的问题的答案需要你理解

var 类型变量有一个 function/script 范围和由于 hoisting 它的声明将从 for 循环中向上移动,所以它将进入到 global scope 而每一次迭代,它都会发生变化,三个闭合都会共享一个变量 i 而如果我们从全局词法范围中替换掉 varlet 那么它将不会在for循环之外移动,成为一个 block-scoped每一次迭代都是一个新的块,会有三个不同的词法作用域,用于三个超时回调和一个共享的全局作用域(我们的代码中没有任何东西)。

© www.soinside.com 2019 - 2024. All rights reserved.