我有一个对象,我将它放在一个数组中,然后i用for
迭代数组,对于数组中的每个对象,我设置一个设置的间隔来调用带参数的对象的方法,但我不能。
这是我的" Class"。
function ClassTest() {
this.test = function(word) {
console.log(word);
}
}
我创建对象并将其放在数组上:
var array = [];
var objectTest = new ClassTest();
array.push(objectTest);
当我设置间隔:
for(var i = 0; i < array.length; i++) {
array[i].loop = setInterval(function() {
array[i].test("hello")
}, 1000);
}
问题是setInterval函数中的var i
存在,我可以创建var index
并且它存在,但我不明白为什么index
存在且var { {1}}没有。:
i
当我不使用 for(var i = 0; i < array.length; i++) {
var index = i;
array[i].loop = setInterval(function() {
array[index].test("hello")
}, 1000);
}
var:
index
答案 0 :(得分:2)
因为您的for
循环立即执行。当您的setInterval()
首次执行时,for
循环将很快完成,您的i
将超出阵列的范围。
在此示例中,我们的array
的{{1}}为3.当我们的length
循环结束时,我们的for
变量将等于i
。如果我们在3
中记录3
,则i
号码会在我们的JavaScript控制台中显示三次:
setTimeout
答案 1 :(得分:2)
无论是否有index
,您的尝试都不正确。您的代码中只有一个 i
变量,当超时触发时,它将具有值array.length
。
这是一个被称为&#34;关闭循环变量&#34;的问题,一种解决它的简洁方法是:
array.forEach(function (item) {
item.loop = setInterval(function () {
item.test("hello");
}, 1000);
});
This question有几个答案可以深入解释您所看到的行为的原因,但是当您使用数组时,大多数高度评价的答案都会过于复杂。 forEach
是要走的路。