#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-сторона.