【问题标题】:Trying to understand JS loops试图理解 JS 循环
【发布时间】:2021-10-13 17:43:18
【问题描述】:

我正在努力理解 JS 循环。 我找到了一个在线教程,用于更改 div id="container" 的随机颜色的按钮。然而,事实证明,随机颜色在单击后经常重复。我想更改代码并逐个循环遍历数组颜色,并在每次单击后更改 div#container 的颜色。这是我的代码:

let colors = ["blue", "yellow", "green", "brown", "orange"];
let btn = document.getElementById("btn");

btn.addEventListener("click", function () {
  let container = document.getElementById("container");
  for (i = 0; i < colors.length; i++) {
    let selectColor = colors[i];
  }

  container.style.backgroundColor = selectColor;
});

我收到错误:分配给未声明的变量 i。有人可以帮帮我吗?

【问题讨论】:

  • for (var i = 0; ...;你从来没有声明i ???? (或let 而不是var)。还有其他问题,但要解决“分配给未声明的变量i”,您需要在for() 循环声明中使用变量关键字。
  • 在 for (let i = ..) 中输入“let”,如下所示:stackoverflow.com/questions/31793924/…
  • @TomDev 您已经编辑了您的问题,现在代码与其原始版本有很大不同。你确定你仍然得到同样的错误吗?代码仍然不会产生你想要的结果,但我猜这个错误不会再发生了。
  • @jnpdx 当我查看修订版时并没有什么不同。而且更改甚至无关紧要,因为在以前的版本和当前版本中,selectColor 在声明的块之外使用时都会抛出 ReferenceError 。即便如此,OP 在该行之前仍会出现错误。

标签: javascript


【解决方案1】:

您一次循环遍历数组中的所有颜色,然后只使用最后一种来设置背景色。

你应该只增加一,然后设置颜色

let colors = ["blue", "yellow", "green", "brown", "orange"];
let btn = document.getElementById("btn");
let i = 0;
let container = document.getElementById("container");

btn.addEventListener("click", function () {
  i++;
  if(i >= colors.length) i = 0;
  container.style.backgroundColor = colors[i];
});

【讨论】:

    【解决方案2】:

    你需要在第 6 行声明变量 i,所以不是

      for (i = 0; i < colors.length; i++) {
        let selectColor = colors[i];
      }
    

    你会的

      for (let i = 0; i < colors.length; i++) {
        let selectColor = colors[i];
      }
    

    【讨论】:

    • 没错,但循环的意义何在?
    • 没有意义,但是问题询问了错误消息和 JS 循环,所以我提供了正确的语法。
    【解决方案3】:

    你错过了在 for 循环中声明“i”。

    for(let i = 0; i < colors.length; i++) {
        let selectColor = colors[i];
    }
    

    【讨论】:

    • 这已被添加为答案和评论;无需再次添加。
    【解决方案4】:

    只是为了补充 Kokodoko 的答案:您不需要循环,因为您需要做的就是在单击按钮时一个接一个地循环遍历数组索引,而不是一次循环所有颜色。

    这是一种稍微不同的方法,它不依赖数组索引作为全局变量。相反,它会向侦听器返回一个函数(闭包),该函数在调用时会从一种颜色变为另一种颜色。

    const colors = ['blue', 'yellow', 'green', 'brown', 'orange'];
    
    const container = document.getElementById('container');
    const btn = document.getElementById('btn');
    
    // We call the function which returns a new function
    // which is what the button calls
    btn.addEventListener('click', handleClick(), false);
    
    // Initially set `index` to 0
    function handleClick(index = 0) {
    
      // This is the function the listener will call
      return function() {
    
        // Set the BG colour to the new index
        // if the index hasn't reached the end of the array
        // otherwise set it to zero, and start again.
        if (index < colors.length - 1) {
          container.style.backgroundColor = colors[index++];
        } else {
          index = 0;
        }
      }
    
    }
    #container {
      width: 100px, height: 100px;
    }
    <button id="btn">Click</button>
    <div id="container">Container</div>

    【讨论】:

    • 谢谢安迪,但你的方法对我来说太先进了。我还是个初学者。总有一天我会弄清楚的。 :) 需要先学习基础知识。
    • @TomDev,我在答案中添加了一些额外的 cmets。如果你是新手,看不懂也没关系,但closures 是一种非常通用的编程方法。
    • 人们可以在这个网站上认识很棒的人。再次非常感谢。我不明白事件监听器中的“错误”。你为什么用它?
    • 不用担心。这是useCapture 选项。我倾向于总是包括它。 @TomDev。祝你编码顺利。
    猜你喜欢
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 2015-12-04
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多