(これはかなりオフカフである。)
メモリの使用が実際にあなたが現在ではと心配する必要が問題ですブラウザの最先端のものですが、非常に多くのコードについて話していない限り、コードサイズが問題であることはわかりません(通常はDOMサイズ、残ったイベントハンドラ)。
ロード可能なモジュールのパターンを使用すると、ブロックをアンロードするのがはるかに簡単になります。少なくとも、ブラウザにはがあります。はアンロードできます。
は検討:
window.MyModule = (function() {
alert('This happens the moment the module is loaded.');
function MyModule() {
function foo() {
bar();
}
function bar() {
}
}
return MyModule;
})();
は通常の方法で互いを呼び出すことができる関数foo
とbar
を含有クロージャを定義します。関数外のコードはすぐに実行されることに注意してください。
閉鎖内のものへの参照をその外側のものに渡さないと、window.MyModuleはその閉包とその実行コンテキストへの唯一の参照になります。それをアンロードするには:あなたはもうそのプロパティを使用していないJavaScript環境を伝え、それがガベージコレクションのために参照可能なものを作る
try {
delete window.MyModule;
}
catch (e) {
// Work around IE bug that doesn't allow `delete` on `window` properties
window.MyModule = undefined;
}
を。そのコレクションが発生するかどうかは明らかに実装に依存します。
イベントハンドラをモジュール内でフックしてアンロードする前にフックを解除することが重要であることに注意してください。あなたは代わりにメイン閉鎖のデストラクタ関数への参照を返すことによってそれを行うことができます
window.MyModule = (function() {
alert('This happens the moment the module is loaded.');
function foo() {
bar();
}
function bar() {
}
function destructor() {
// Unhook event handlers here
}
return destructor;
})();
アンフックは次のようになります。通訳はガベージコレクタを持っているJavaScriptの
if (window.MyModule) {
try {
window.MyModule();
}
catch (e) {
}
try {
delete window.MyModule;
}
catch (e) {
// Work around IE bug that doesn't allow `delete` on `window` properties
window.MyModule = undefined;
}
}
MYAPPまたはMYAPP =未定義を削除しないのはなぜですか? – Dykam
変数そのものだけでなく、作成される可能性のあるクロージャも内部の関数です。 – txwikinger
@txwinker:はい、私はそれが暗示されたと感じたと思います。これが機能するためには、MYAPPもその内部のものも参照してはいけません。そして、メモリやIEが漏れてくると、細かいところがあります。 @Dykam:未定義ではない理由はありませんが、私はそれに多くの経験を持っていないので、削除を避けました。 "1"は、OPが何をしているのかに大きな記憶をかけるべきではありません。 – Svend