Как решить Var вне сферы действия в вызове setTimeout
Я пытаюсь вызвать setTimeout из обратного вызова setInterval:
function callback()
{
//assign myVar
var myVar = document.getElementById("givenID");
//...
//now wait 2 secs then call some code that uses myVAr
setTimeout("myVar.innerHTML = 'TEST'", 2000);
}
setInterval("callback();", 10000);
setInterval работает так, как ожидалось, но вызов setTimeout не работает. Я думаю, проблема связана с тем, что я ссылаюсь на переменную (myVar), которая не входит в область видимости.
Какой лучший способ решить эту проблему?
Ответы
Ответ 1
Это идеальный кандидат на закрытие:
setInterval(
function ()
{
var myVar = document.getElementById("givenID");
setTimeout(
function()
{
// myVar is available because the inner closure
// gets the outer closures scope
myVar.innerHTML = "Junk";
},2000);
}, 10000);
Ваша проблема связана с областью, и это обойдется.
Ответ 2
У меня была аналогичная проблема. Проблема заключалась в том, что я пытался вызвать метод изнутри через setTimeout(). Что-то вроде этого, КОТОРЫЙ НЕ РАБОТАЕТ ДЛЯ МЕНЯ:
function myObject() {
this.egoist = function() {
setTimeout( 'this.egoist()', 200 );
}
}
myObject001 = new myObject();
myObject001.egoist();
Следующая ТАКЖЕ НЕ РАБОТАЕТ:
... setTimeout( egoist, 200 );
... setTimeout( egoist(), 200 );
... setTimeout( this.egoist, 200 );
... setTimeout( this.egoist(), 200 );
... setTimeout( function() { this.egoist() }, 200 );
Решение заключалось в том, чтобы использовать оператор() следующим образом:
function myObject() {
this.egoist = function() {
with (this) { setTimeout( function() { egoist() }, 200 );}
}
}
myObject001 = new myObject();
myObject001.egoist();
Конечно, это бесконечный цикл, но точка, которую я здесь делаю, отличается.
Надеюсь, что это поможет:)
Ответ 3
В качестве наилучшей практики попробуйте не использовать строки в качестве параметров для setTimeout
и setInterval
, потому что это вызовет eval
... Использование следующей формы также может облегчить эту проблему для понимания/отладки
setInterval(function () {
// do stuff
// ...
// now wait 2 secs then call someFunction
setTimeout(someFunction, 2000);
}, 10000);
Ответ 4
Запустите его в Firefox и установите флажок "Инструменты | Консоль ошибок. если setTimeout не работает, он может сказать вам, почему.
Также попробуйте заменить "someFunction();"
на "alert('hi')"
(без точки с запятой) и посмотреть, работает ли это. Если это так, проблема значительно сужается.