gpt4 book ai didi

Javascript:在其方法之一上为数组中的每个对象提供一个setInterval

转载 作者:行者123 更新时间:2023-11-30 08:46:19 24 4
gpt4 key购买 nike

javascript 新手。

我有一个带有方法更新的自定义对象。我有一组对象。

  function update_all(objects){
for (var i = 0 ; i < objects.length; i++){
var obj = objects[i];
var repeater = setInterval(function () {obj.update();}, 1000);
}
}

奇怪的是,只有数组的最后一个对象获得对象更新方法的设置间隔。此外,所有 setintervals 都指向数组的最后一个对象。因此,例如,如果有 4 个对象,则最后一个对象每秒更新 4 次,其他对象则完全不更新。怎么回事?

谢谢

最佳答案

在 JavaScript 中,for 循环不会为变量打开新的作用域。您的 obj 变量至少具有函数作用域(如果您的代码在函数或全局作用域中)。也就是说,for 循环的每次迭代实际上更改函数中单个obj 变量的值。当您离开 for 循环时,您会得到很多计时器,但它们都对同一个对象调用更新。

为了防止这种情况,您需要将循环体提取到另一个函数中,以便为每次迭代创建一个新的范围。除了一些其他建议外,它可能看起来像这样:

var i, n;

for (i = 0, n = objects.length; i < n; i++) {
createIntervalToCallUpdate(objects[i]);
}

还有你的函数:

function createIntervalToCallUpdate(objectToUpdate) {
var repeater = setInterval(function () { objectToUpdate.update(); }, 1000);
}

要对此有更多的了解,请阅读一个名为“提升”的概念,例如 article about scoping and hoisting .提升也是许多人建议在函数顶部声明所有变量的原因。如果您在函数的顶部声明了 obj(这意味着在 for 循环之外),您就不会相信可以为每次迭代重新定义变量。

更新:Philipp 的建议很棒,因为它使代码更简单且更易于阅读(假定您的浏览器支持相当新的 array.forEach)。它基本上与上面的代码完全相同,只是它已经为您完成了第一个片段的任务。

关于Javascript:在其方法之一上为数组中的每个对象提供一个setInterval,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21754354/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com