1

リソースが XHR を介して (文字列として) ロードされ、DOM に注入される複雑なクライアント側テンプレート システムを用意します。

これまでの Javascript 挿入では、スクリプト タグを動的に作成して DOM に追加していました。これは、最新のブラウザーでの速度のためだけでなく、テンプレートが不要になったときにスクリプトをクリーンアップ/削除できるようにするためでもあります。

ただし、古いブラウザーと IE (最新の 10 バージョンでも) では、特に window.eval() は、新しいタグを介してコードを挿入するよりも、コードの評価がはるかに高速であるようです。IE ネイティブの execScript でさえ、eval よりもずっと遅いです。

IEでパフォーマンスを向上させるためにevalを使用するように最適化してみますが、後でそのような評価されたJavascriptを参照または削除する方法がわかりません。誰かがこれをどのように行うかについて何かアイデアを持っているなら、それをいただければ幸いです。

4

1 に答える 1

3

これまでの Javascript 挿入では、スクリプト タグを動的に作成して DOM に追加していました。これは、最新のブラウザーでの速度のためだけでなく、テンプレートが不要になったときにスクリプトをクリーンアップ/削除できるようにするためでもあります。

あなたはそこで何かを誤解している可能性があると思います。要素を削除しても、要素に含まれていたスクリプトは、読み込まれた JavaScript コンテキストから削除されscriptません: http://jsbin.com/ujirat

ただし、古いブラウザーと IE (最新の 10 バージョンでも) では、特に window.eval() は、新しいタグを介してコードを挿入するよりも、コードを評価する方がはるかに高速であるようです。そのような評価されたJavascriptを後で参照または削除する方法はありません。

これは、タグを介してロードされたスクリプトとまったく同じscriptです。「アンロード」する唯一の方法は、それへのすべての参照を削除することです。これにより、ガベージ コレクションの対象になります。これを行う最善の方法は、スクリプトで、そのスクリプトのすべての機能を含む単一のグローバル シンボルを定義することです。次に例を示します。

var foo = (function () {
    var f = {};

    f.foo = function() { ... };

    f.bar = function() { ... };

    return f;
})();

次に、次のようにして「アンロード」できます。

foo = undefined;

...ただし、クリーンアップされない自身への参照を提供しない場合 (イベント ハンドラーやその他のクロージャーの設定など)。

于 2012-07-15T23:01:28.707 に答える