(這是相當現成的,袖口。)
內存使用確實需要在當前被關注的一個問題雖然除非我們談論了很多代碼,但我不知道代碼大小是個問題(通常是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將是對該封閉封閉及其執行上下文的唯一引用。卸載它:
try {
delete window.MyModule;
}
catch (e) {
// Work around IE bug that doesn't allow `delete` on `window` properties
window.MyModule = undefined;
}
這告訴JavaScript環境你不再使用該屬性,並使它引用可用於垃圾回收的任何東西。何時以及該集合是否發生顯然取決於實施。
請注意,如果您在卸載之前鉤住模塊內的事件處理程序以解除它們,這將非常重要。你可以做到這一點的一個參考返回到構函數而不是主關閉:
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;
})();
脫鉤則是:
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 = undefined? – Dykam 2009-08-28 13:17:30
不僅變量本身,而且任何可能創建的閉包都是裏面的函數。 – txwikinger 2009-08-28 13:19:08
@txwinker:是的,我想我覺得那是暗示的。爲了這個工作,不得提及任何MYAPP,也不能提及其中的任何內容。當涉及到泄漏內存和IE時,有一些令人費解的細節。 @Dykam:沒有理由不去定義,但是我避免了刪除,因爲我對它沒有太多的經驗,而且「1」不應該給OP做任何事情帶來巨大的內存壓力。 – Svend 2009-08-28 13:34:50