Лучший способ разрешить функции запускаться несколько раз с помощью setInterval()?

#javascript #setinterval

#javascript #setinterval

Вопрос:

какой наилучший способ заставить функцию выполняться несколько раз с помощью setInterval()? Проблема с моей попыткой здесь в том, что переменная «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;
    }
}
  

Спасибо за любой совет…

Комментарии:

1. Как насчет цикла for?

2. вы определяете таймер в другой функции?

Ответ №1:

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

 ...
        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. Это должно быть что-то вроде setInterval(function(){toggleCharCount(timer)}, 500) .

Ответ №2:

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

Ответ №3:

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

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

Ответ №4:

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 видимым в глобальной области видимости, где его может видеть любая другая 3d-сторона.