【问题标题】:In the for loop the i variable is different each time through the loop在 for 循环中,i 变量每次通过循环都是不同的
【发布时间】:2019-08-23 02:00:42
【问题描述】:

下面的代码不是我的代码。有人可以解释一下吗?我不太了解 JavaScript,所以我不太了解它。我认为这就是为什么我不明白在 for 循环中使用 let 如何使 i 变量在循环中的每个循环中都不同?使用 var 应该做同样的事情。

<html>
  <head>
    <title>buttons - let and Const</title>
  </head>
  <body>
    <h1>Buttons</h1>
    <button>Button 0</button>
    <button>Button 1</button>
    <button>Button 2</button>
    <button>Button 3</button>
    <button>Button 4</button>
    <button>Button 5</button>
    <button>Button 6</button>
    <button>Button 7</button>
    <button>Button 8</button>
    <button>Button 9</button>
    <script>
      const buttons = document.getElementsByTagName("button");
      
      for(let i = 0; i < buttons.length; i++) {
          const button = buttons[i];
          button.addEventListener("click", function() {
              alert("Button " + i + " Pressed");
          }); 
      }
    </script>
  </body>
</html>

【问题讨论】:

标签: javascript


【解决方案1】:

只有在尝试异步访问变量时,才能看到 for 循环中 letvar 之间的主要区别。使用var,变量会被分配一次,并且在每次迭代中,该值都会改变。使用let,变量将在每次迭代时分配到不同的内存位置,并且前一次迭代的值将被复制到新位置。如果您异步访问它,它将引用该内存位置。

 for(var i = 0, test = 0; i < 10; i++) {
   // test: 1, 2, 3 -> the same value gets mutated
   // i: 10, 10, 10-> the same value, the loop already finished
   setTimeout(() => console.log("i", i, "test 1", ++test)); 
 }

for(let i = 0, test = 0; i < 10; i++) {
  // test: 1, 1, 1 -> a new "test" got allocated on each iteration
  // i: 0, 1, 2 -> kept at every iteration
  setTimeout(() => console.log("i", i, "test 2", ++test));
}

【讨论】:

  • 您能否评论一下您从何处获得此信息的链接?我想了解更多相关信息
  • 嗯,肯定的答案总是spec,但MDN 更具可读性
【解决方案2】:

let 关键字用于声明具有有限范围的变量。

这里有一个很棒的articleletvar 之间的区别。

来自文章:

let 赋予您声明变量的特权,这些变量的范围仅限于块、表达式语句,与 var 不同。

在您的示例中,i 仅在 for 循环范围内可用。

【讨论】:

  • 我对它们之间的区别感到困惑,因为我在十分钟前读到“在 for 循环中,i 变量每次通过循环都是不同的”,这对我来说很奇怪,因为我觉得var 每次循环都不同,因为 i 递增 1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 2018-10-13
  • 1970-01-01
  • 2011-08-16
  • 1970-01-01
相关资源
最近更新 更多