0

在解决了一个关于如何使用 setIterval 函数每隔 XXX 秒显示一个数组的数据的问题后,代码如下:

var iterations = 0,
    data = ['a','bbbbbbbb','c'],
    interval = setInterval(foo, 4000);

function foo() {
    console.log(data[iterations]);
    iterations++;
    if (iterations >= 4){
        clearInterval(interval);
    }else if(iterations == 1){
        //we want to make time longer in this iteration.
        clearInterval(interval);
        interval = setInterval(foo, 8000);
    }
}

我想清理东西并将所有这些封装到一个函数中。问题是,当我将全局变量插入函数时,foo 说所有变量都是未知的,所以我必须将它们作为 attrs 传递。另外,我已将时间间隔更改为此以检测它,但现在它不起作用。同时显示所有数据,似乎忽略了setIterval

runTest();

function runTest(){
    var iterations = 0,
    data = [1,2,3,4,5],
    maxIterations = 5,
    interval = setInterval(foo(iterations,data,maxIterations),4000);    
}

function foo(iterations,data,maxIterations){
    var sentence = data[iterations];
    var div = d3.select('div').append('p').text(sentence);
    iterations++;
    if (iterations >= maxIterations){
        clearInterval(this);
    }else{
        clearInterval(this);
        interval = setInterval(foo(iterations,data,maxIterations),4000);
    }
}

如果我在 Chrome 调试器流应用程序上设置断点似乎是正确的。

你知道问题出在哪里吗?谢谢!

4

2 回答 2

0

setInterval 需要函数作为参数(或函数引用)。但是,您将函数调用的结果传递给 foo。

你可能想要类似的东西

var iterations = 0,
data = [1,2,3,4,5],
maxIterations = 5,
interval = setInterval(function() { foo(iterations,data,maxIterations); }, 4000);

在这里,您传递了一个函数,该函数又使用所有必要的参数调用 foo。

于 2013-05-11T12:41:53.403 回答
0

问题是您第一次在函数中声明了变量“interval”。该变量不是全局的,而是本地化到该函数的。

如果您首先在任何函数之外声明您想要全局的所有变量,它将起作用。

var iterations, maxIterations, data, interval;

runTest();

function runTest(){
    iterations = 0,
    data = [1,2,3,4,5],
    maxIterations = 5,
    interval = setInterval(foo(iterations,data,maxIterations),4000);    
}

请注意,函数 foo() 可能不会更改全局变量的值,因为您为局部变量选择了相同的名称。

于 2013-05-11T13:29:46.763 回答