Как решить Var из области видимости в вызове setTimeout - PullRequest
12 голосов
/ 26 октября 2008

Я пытаюсь вызвать 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), которая находится вне области действия.

Какой лучший способ решить эту проблему?

Ответы [ 4 ]

32 голосов
/ 26 октября 2008

Это идеальный кандидат на закрытие:

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);

Ваша проблема связана с областью действия, и это обойдется.

11 голосов
/ 30 июля 2011

У меня была похожая проблема. Проблема заключалась в том, что я пытался вызвать метод изнутри себя через 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();

Конечно, это бесконечный цикл, но смысл, который я здесь подчеркиваю, другой.

Надеюсь, это поможет:)

4 голосов
/ 26 октября 2008

В качестве передового опыта старайтесь не использовать строки в качестве параметров для setTimeout и setInterval, потому что это вызовет eval ... Использование следующей формы также может облегчить понимание / отладку этой проблемы :

setInterval(function () {
    // do stuff
    // ...
    // now wait 2 secs then call someFunction
    setTimeout(someFunction, 2000);
}, 10000);
1 голос
/ 26 октября 2008

Запустите его в Firefox и проверьте Инструменты | Консоль ошибок. если setTimeout не удается, он может сказать вам, почему там.

Также попробуйте заменить "someFunction();" на "alert('hi')" (без точки с запятой) и посмотрите, работает ли это. Если это так, проблема значительно сузится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...