javascript - setInterval 的使用导致奇怪的无限循环

标签 javascript

我正在尝试 map 类(class),但被 setInterval 绊倒,导致无限循环。由于我只查看包含 5 个元素的列表,因此我不明白为什么会发生这种情况;它打印出所有 5 个数字,例如:

1
2
3
4
5

一遍又一遍地永远:

var list = [1, 2, 3, 4, 5];

function delayedPrint(text, delay = 400) {
    setInterval(function() {
        console.log(text);
    }, delay)
}

console.log('\nMap can take 1 argument, which is each item in the array:')

list.map(function(this_list_item) {
    delayedPrint(this_list_item);
});

但是将 delayedPrint(this_list_item); 更改为 console.log(this_list_item); 代码可以正常工作,打印每个项目 1 次。

为什么会发生这种无限循环以及如何以任意延迟打印这些项目? `setInterval` Apparent Infinite Loop没有帮助。

最佳答案

您必须使用 setTimeout 来延迟调用函数一次

setInterval 将在每延迟毫秒内无限次调用该函数。

如果您想要实现的是打印一个项目,然后在延迟毫秒后打印另一个项目,依此类推,这是实现它的一种方法(手动增加每个项目的延迟):

var list = [1, 2, 3, 4, 5];
var delay = 400;

function delayedPrint(text, delay = 1000) {
    setTimeout(function() {
        console.log(text);
    }, delay)
}

list.map(function(this_list_item, index) {
    delayedPrint(this_list_item, index * delay);
});

顺便说一句,正如 Nina 正确指出的那样,map 可能不是传达您在这里所做的事情的最佳选择,forEach 会更清晰:

list.forEach(function(this_list_item, index) {
    delayedPrint(this_list_item, index * delay);
});

关于javascript - setInterval 的使用导致奇怪的无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44450783/

相关文章:

javascript - 使用 cheerio(如 JQuery)自动提交查询

javascript - cloudinary url 的正则表达式组

javascript - 单击其他元素与单击此元素相同

javascript - jQuery 在悬停时在链接上添加背景颜色,当鼠标悬停子菜单时背景保持不变?

javascript - 在 Angularjs 中单击后更改按钮颜色

Javascript 创建的表单未出现在页面上

javascript - 最大宽度正在改变位置 :fixed margin

javascript - jQuery 函数不返回值

javascript - 假终端浏览器 - 如何让它响应

javascript - 创建盒装/框架布局