Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript “设置间隔”内的“for”索引_Javascript_For Loop_Setinterval - Fatal编程技术网

Javascript “设置间隔”内的“for”索引

Javascript “设置间隔”内的“for”索引,javascript,for-loop,setinterval,Javascript,For Loop,Setinterval,我有一个对象,我把它放在一个数组中,我用for迭代数组,对于数组中的每个对象,我用一个参数设置了一个调用对象方法的间隔,但是我不能。 这是我的课 function ClassTest() { this.test = function(word) { console.log(word); } } 我创建对象并将其放置在数组中: var array = []; var objectTest = new Clas

我有一个对象,我把它放在一个数组中,我用for迭代数组,对于数组中的每个对象,我用一个参数设置了一个调用对象方法的间隔,但是我不能。 这是我的课

    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);
    }
当我不使用索引变量时,会出现此错误:

因为for循环会立即执行。当您的setInterval第一次执行时,for循环将早已完成,i将超出数组的范围

实例 在本例中,数组的长度为3。当for循环完成时,i变量将等于3。如果我们在setTimeout内记录i,则数字3将在JavaScript控制台中显示三次:

var数组=[1,2,3]; 对于var i=0;i<数组长度;i++{ setTimeoutfunction{ console.logi; }, 1000; } 因为for循环会立即执行。当您的setInterval第一次执行时,for循环将早已完成,i将超出数组的范围

实例 在本例中,数组的长度为3。当for循环完成时,i变量将等于3。如果我们在setTimeout内记录i,则数字3将在JavaScript控制台中显示三次:

var数组=[1,2,3]; 对于var i=0;i<数组长度;i++{ setTimeoutfunction{ console.logi; }, 1000;
} 无论有无索引,您的尝试在这两种情况下都是不正确的。您的代码中只有一个i变量,当超时触发时,它的值将为array.length

这是一个被称为闭合循环变量的问题,解决该问题的一种干净方法是:

array.forEach(function (item) {
    item.loop = setInterval(function () {
        item.test("hello");
    }, 1000);
});

有几个答案可以深入解释您看到的行为的原因,但大多数投票率较高的答案在处理数组时过于复杂。forEach是一条路。

无论有无索引,您的尝试在这两种情况下都是不正确的。您的代码中只有一个i变量,当超时触发时,它的值将为array.length

这是一个被称为闭合循环变量的问题,解决该问题的一种干净方法是:

array.forEach(function (item) {
    item.loop = setInterval(function () {
        item.test("hello");
    }, 1000);
});

有几个答案可以深入解释您看到的行为的原因,但大多数投票率较高的答案在处理数组时过于复杂。forEach是一种方法。

执行setInterval回调时,i等于array.length。例如,看看如何解决这个问题。你能分享一下首先出现的错误吗。或者我不存在。当您执行setInterval的回调时,我等于array.length。例如,看看如何解决这个问题。你能分享一下首先出现的错误吗。或者只是我不存在。但是,如果您需要支持IE 8,则Array.prototype.forEach不可用。@Phylogenesis如果您需要支持IE 8,则可以使用。但是,如果您需要支持IE 8,则Array.prototype.forEach不可用。@Phylogenesis如果您需要支持IE 8,则可以使用。
array.forEach(function (item) {
    item.loop = setInterval(function () {
        item.test("hello");
    }, 1000);
});