1

IE を除くすべてのブラウザーで完全に正常に動作するclearTimeout関数をオーバーライドしようとしています(IE8 でテスト済み)。

clearTimeout = function(){};

IE8 では次のエラーが発生します。

Object doesn't support this action

しかし、私がそうするとき、

window.clearTimeout = function(){};

clearTimeout をオーバーライドすると、完全に正常に動作します。この動作はなぜですか?

また、コードのどこでも、window.clearTimeoutとしてではなく、 clearTimeoutを直接呼び出しています。したがって、(2 番目の方法で) clearTimeout をオーバーライドしても、オーバーライドされた clearTimeout ではなく、ネイティブの clearTimeout が呼び出されます。これに対する回避策は何ですか?

4

1 に答える 1

0

IE では、最初はプロパティ setTimeout がウィンドウ自体ではなく、ウィンドウのプロトタイプに存在します。そのため、window.setTimeout を要求すると、参照を解決するためにプロトタイプ チェーンの 1 つのステップを実際にトラバースします。同様に、setTimeout を要求すると、スコープ チェーンをたどり、ウィンドウに移動し、プロトタイプ チェーンをたどって参照を解決します。

IE には組み込みの最適化機能があり、グローバル オブジェクトのプロトタイプで発見された暗黙のグローバルの解決を自動的にキャッシュするのではないかと思います。これらは一般的に要求される参照であり、そのチェーンをたどるとコストがかかるため、そうするのには十分な理由があります。ただし、これはキャッシュの最適化にすぎないため、この参照を読み取り専用に設定する必要があります。これには、参照を左辺値として使用して参照に割り当てようとすると、例外がスローされるという不幸な副作用があります。

ソース: http://www.adequatygood.com/2011/4/Replaceing-setTimeout-Globally

于 2013-03-10T18:28:29.917 に答える