12

setInterval コールバック内から setTimeout を呼び出そうとしています:

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

4 に答える 4

32

これはクロージャの完璧な候補です:

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

あなたの問題はスコープに関連しており、これはそれを回避します。

于 2008-10-26T02:13:39.183 に答える
11

同様の問題がありました。問題は、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 );

解決策は、 with() ステートメントを次のように使用することでした。

function myObject() {

   this.egoist = function() {
      with (this) { setTimeout( function() { egoist() }, 200 );}
   }

}

myObject001 = new myObject();
myObject001.egoist();

もちろん、これは終わりのないサイクルですが、ここで私が主張している点は異なります。

お役に立てれば :)

于 2011-07-30T15:40:42.433 に答える
4

setTimeoutベスト プラクティスとして、文字列をandのパラメータとして使用しないようにしてください。これにより、...setIntervalが呼び出されるためevalです。次の形式を使用すると、この問題の理解/デバッグが容易になる場合もあります。

setInterval(function () {
    // do stuff
    // ...
    // now wait 2 secs then call someFunction
    setTimeout(someFunction, 2000);
}, 10000);
于 2008-10-26T02:13:37.217 に答える
1

Firefox で実行し、[ツール] | [ツール] を確認します。エラーコンソール。setTimeout が失敗した場合、その理由がわかります。

また、 (セミコロンなし)に置き換え"someFunction();"てみて、それが機能するかどうかを確認してください。"alert('hi')"もしそうなら、問題は大幅に絞り込まれます。

于 2008-10-26T01:57:59.463 に答える