“setInterval”里面的“for”索引

时间:2015-04-02 10:20:22

标签: javascript for-loop setinterval

我有一个对象,我将它放在一个数组中,然后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

2 个答案:

答案 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是要走的路。