使用setInterval()让函数运行多次的最佳方法是什么?

时间:2011-04-07 19:20:17

标签: javascript setinterval

使用setInterval()多次执行函数的最佳方法是什么? 我在这里尝试的问题是,清除Interval ...时不知道变量“timer”

...
        if (counter.hasClass("superWarn")){
            var timer = setInterval(toggleCharCount(), 500);
    }
...

function toggleCharCount() {
    if(typeof toggleCharCount.i == 'undefined'){
        toggleCharCount.i = 0;
    }
    toggleCharCount.i++;
    $('#twCharCount').toggle();
    if (toggleCharCount.i>=4){
        window.clearInterval(timer);
        toggleCharCount.i = 0;
    }
}

任何建议......

4 个答案:

答案 0 :(得分:3)

为什么不把计时器传递给回调?

...
        if (counter.hasClass("superWarn")){
            var timer = setInterval(function(){toggleCharCount(timer)}, 500)
    }
...

function toggleCharCount(timer) {
    if(typeof toggleCharCount.i == 'undefined'){
        toggleCharCount.i = 0;
    }
    toggleCharCount.i++;
    $('#twCharCount').toggle();
    if (toggleCharCount.i>=4){
        window.clearInterval(timer);
        toggleCharCount.i = 0;
    }
}

答案 1 :(得分:1)

我看不到你完整的javascript代码,看来变量计时器似乎不在全局范围内。如果将'timer'移动到globalscope中,函数'toglleCharCount()'将获得访问权。

答案 2 :(得分:1)

function tester(asd){
  alert(timer);
}
var timer = setInterval(function(timer){
  tester(timer)
}, 5000);

工作示例http://jsfiddle.net/EEAAC/

答案 3 :(得分:0)

1)从我的测试来看,如果你把一个函数命名为变量,那就不好了:D:

var foo = {i:'my number'};
function foo(){
    alert(foo.i);
}

要么将foo解释为一个对象,要么作为一个函数,要么它不能同时保存两个不同的值。
2)当您将参数作为函数调用(setTimeout(myFunction(),t))发送时,在定义setTimeout时执行该函数。正确的方法是发送函数,而不是函数调用,或者将要评估的字符串:

setTimeout(myFunction,t);
// or
setTimeout("myFcuntion()",t);
// or the best way :
setTimeout(function(){myFunction();},t);

3)timer声明的范围与clearInterval函数的范围不同,因此当您想要清除间隔时,您没有对间隔本身的任何引用,因为{{ 1}}是timer。您应该在相同的范围内对它们进行delcare,或者您可以将undefined视为全局(不包括timer关键字),从而使var在全局范围内可见,其中任何其他3d派对可以看到它。