Лучший способ позволить функции запускаться несколько раз с помощью setInterval ()? - PullRequest
0 голосов
/ 07 апреля 2011

Каков наилучший способ, чтобы функция выполнялась несколько раз с помощью 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 ]

3 голосов
/ 07 апреля 2011

почему вы не передаете таймер в обратный вызов?

...
        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 голос
/ 07 апреля 2011
function tester(asd){
  alert(timer);
}
var timer = setInterval(function(timer){
  tester(timer)
}, 5000);

рабочий пример http://jsfiddle.net/EEAAC/

1 голос
/ 07 апреля 2011

Я не вижу ваш полный код JavaScript, но кажется, что переменная timer не находится в глобальной области видимости.Если вы переместите 'timer' в globalscope, функция 'toglleCharCount ()' получит доступ.

0 голосов
/ 08 апреля 2011

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Таким образом, когда вы хотите очистить интервал, вы не имеете никакой ссылки на сам интервал, потому что timer равен undefined.Вы должны сделать так, чтобы они оба находились в одной и той же области видимости, или вы можете объявить timer глобальным (без ключевого слова var), сделав таким образом timer видимым в глобальной области видимости, где его может увидеть любая третья сторона.

...