WebアプリケーションのJavascriptで作業しているときにsetTimeout
を使用していることに気付きましたが、clearInterval
を使用してそれをクリアしようとしたため、Googleでタイムアウトが発生しなくなりましたChromeおよびInternet Explorer 9。
clearTimeout
とclearInterval
は交換可能ですか?
これがJSfiddleです 私が話していることの例を示します。
いいえ、互換性はありません。
確かに、一部のブラウザーは同じコードを共有して間隔とタイムアウトを同じ方法でクリアすることができますが、それらがinterchangeableであることを意味するわけではなく、すべてのブラウザーで同じように動作することが保証されていません実装。これは、これら2つのメソッドが目的ごとに異なる方法で定義されているため、指定された用途に使用する必要があります。それ以外の場合は、問題が発生するだけです。
実際、私はW3C仕様からかなり強力な結論を下せると信じています( http://www.w3.org/TR/html5/webappapis.html#timers )。明示的に保証されているわけではありませんが、ほとんどすべての妥当な実装がこの動作をするという多くの証拠があります。
1)タイムアウトと間隔は、実際には同じ基本機能を使用します。
SetTimeout()メソッドは、タイマーの初期化ステップによって返された値を返し、メソッドの引数を渡して、繰り返しフラグをfalseに設定する必要があります。
SetInterval()メソッドは、タイマーの初期化ステップから返された値を返し、メソッドの引数を渡して、繰り返しフラグをtrueに設定する必要があります。
2)この単一の関数-上記の「タイマー初期化手順」は、単一のタイマーリストを使用します。
2、... letハンドルは、アクティブタイマーのリストでこの呼び出しによって設定されるタイムアウトを識別する、ゼロより大きいユーザーエージェント定義の整数です。
10、戻りハンドル...
3)clearTimeout()とclearInterval()は両方ともそのリストを操作します(実際、仕様によって区別されていません)。
ClearTimeout()メソッドとclearInterval()メソッドは、メソッドが呼び出されたWindowTimersオブジェクトのアクティブタイマーのリストから、ハンドルとして識別されるエントリをクリアする必要があります。ハンドルは、メソッドに渡される引数です(存在する場合)。 (ハンドルが、メソッドが呼び出されたWindowTimersオブジェクトのアクティブタイマーのリストのエントリを識別しない場合、メソッドは何もしません。)
これは、仕様に従ってclearTimeoutとclearIntervalが同意語であるべきかなり強いケースを示していると思います。これは、これが私がテストしたすべてのブラウザ(Chrome 37、Firefox 33、およびOpera 25))で機能するという事実によって裏付けられています。
Mozillaリファレンス から:
SetTimeout()とsetInterval()が使用するIDのプールは共有されていることに注意してください。つまり、技術的には、clearTimeout()とclearInterval()を交換して使用できます。ただし、明確にするために、そうすることは避けてください。
同義語として使用できる場合でも、将来はいつでも変更される可能性があります。なぜスペードをスペードと呼んではいけないのですか? :-)