javascript - 为什么在 forEach 迭代中为变量分配多个值?

标签 javascript

我正在尝试制作一个简单的列表,其中每个项目将依次显示

html

<!DOCTYPE html>
<html>
<head>

</head>
<body>
    <script src = "async.js"></script>
</body>
</html>

java脚本

let list = [
    {
        name: 'one',
    },
    {
        name: 'two',
    }
]
let output = '';
function print(){
    setTimeout(()=>{
        list.forEach(function(element){
            output = `<li>${element.name}</li>`; // critical line
            document.body.innerHTML += output;
        })
    },500)
}

function add(element){
   setTimeout(() =>{
    list.push(element);
   },400)
}

add({name: 'three'});

let c=0;
setTimeout(()=>{  // waits for add function to be executed
    for(let i=0;i<list.length;i++){
        setTimeout(print,c);
        c+=1000;
    }
},1000)

问题是输出值每次迭代都会获取所有名称,并打印 3 个名称 3 次,而不是一次打印 1 个名称。你能解释一下吗?

最佳答案

  1. 列表以两项开始。
  2. add({name: 'three'});添加第三个
  3. for(let i=0;i<list.length;i++){循环列表并调用 setTimeout(print,c);三次(因为列表中有三件事)
  4. function print(){打印列表中的三件事中的每一项(由于步骤 3,它运行了三次)。

所以......如果我正确理解你的误解:

print打印列表中的每个项目,因为它循环遍历列表。

print 打印特定项目,因为它 (a) 不是为打印一项而设计的,并且 (b) 您没有向它传递一个参数来告诉它要打印哪一项。

您可能想要以下内容:

let list = [{
    name: 'one',
  },
  {
    name: 'two',
  },
  {
    name: 'three'
  }
];

let current_index = 0;

function print() {
  const element = list[current_index];
  if (!element) {
    return; // end of the list
  }
  const output = `<li>${element.name}</li>`;
  document.querySelector("ul").innerHTML += output;
  current_index++;
  setTimeout(print, 1000);
}

setTimeout(print, 1000);
<ul></ul>

…您可以在其中跟踪正在处理的数组中的哪个元素,并在将数据添加到 HTML 时递增计数器,而不是全部在一个立即循环中进行。

关于javascript - 为什么在 forEach 迭代中为变量分配多个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60894576/

相关文章:

java - 通过 Play 商店的 Android 应用类别

javascript - 下一条语句不执行 - jQuery

javascript 正则表达式从 config.php 字符串中提取路径

javascript - 无法从js对象中删除键值对

Javascript xmlhttp 获取对 nodejs 服务器的请求不返回任何内容

javascript - Angularjs 范围的父 ID

javascript - Moment.js 仅在上周内

javascript - 如何使阅读项目在滚动时保持在同一位置

javascript - 带有 json 参数的 Angular http 请求

Javascript Regex - 匹配比表达式短的字符串?