setInterval不能用于其他函数

时间:2013-05-11 12:27:25

标签: javascript setinterval

解决了如何使用带有代码的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上设置断点,那么调试程序流程应用似乎是正确的。

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

2 个答案:

答案 0 :(得分:0)

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

你可能想要像

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

这里传递一个函数,该函数又调用foo并包含所有必要的参数。

答案 1 :(得分: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()可能不会更改全局变量的值,因为您为局部变量选择了相同的名称。