(này được khá off-the-cuff.)
sử dụng bộ nhớ thực sự là một vấn đề bạn cần phải quan tâm đến việc trong hiện tại trình duyệt của nhà nước của nghệ thuật, mặc dù trừ khi chúng tôi đang nói về khá nhiều mã, tôi không biết rằng kích thước mã là vấn đề (nó thường là kích thước DOM, và xử lý sự kiện còn sót lại).
Bạn có thể sử dụng mẫu cho các mô-đun có thể tải để dễ dàng tải chúng xuống hàng loạt - hoặc ít nhất, để cho trình duyệt biết rằng có thể dỡ chúng.
xem xét:
window.MyModule = (function() {
alert('This happens the moment the module is loaded.');
function MyModule() {
function foo() {
bar();
}
function bar() {
}
}
return MyModule;
})();
Đó định nghĩa một kết thúc có chứa các chức năng foo
và bar
, có thể gọi nhau theo cách thông thường. Lưu ý rằng mã bên ngoài chức năng chạy ngay lập tức.
Miễn là bạn không đưa ra bất kỳ tham chiếu nào về nội dung bên trong đóng bất kỳ thứ gì bên ngoài nó, sau đó window.MyModule sẽ là tham chiếu duy nhất cho việc đóng và ngữ cảnh thực thi của nó. Để hủy tải xuống:
try {
delete window.MyModule;
}
catch (e) {
// Work around IE bug that doesn't allow `delete` on `window` properties
window.MyModule = undefined;
}
Điều đó cho môi trường JavaScript bạn không sử dụng thuộc tính đó nữa và làm cho mọi thứ tham chiếu có sẵn để thu thập rác. Khi nào và liệu bộ sưu tập đó có xảy ra rõ ràng là phụ thuộc vào việc triển khai thực hiện hay không.
Lưu ý rằng nó sẽ rất quan trọng nếu bạn móc trình xử lý sự kiện trong mô-đun để hủy chúng trước khi dỡ. Bạn có thể làm điều đó bằng cách trả lại một tham chiếu đến một hàm destructor thay vì việc đóng cửa chính:
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;
})();
unhooking là sau đó:
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;
}
}
Nguồn
2009-08-28 13:23:27
Tại sao không xóa MYAPP hoặc MYAPP = không xác định? – Dykam
Không chỉ bản thân biến, mà còn bất kỳ bao đóng nào có thể được tạo ra là các hàm bên trong. – txwikinger
@txwinker: Vâng, tôi đoán tôi cảm thấy điều đó được ngụ ý. Để làm việc này, không được có tham chiếu đến cả MYAPP lẫn bất cứ thứ gì bên trong nó. Và có một số chi tiết khó tính khi nói đến rò rỉ bộ nhớ và IE. @ Dykam: Không có lý do để không đi không xác định, nhưng tôi tránh xóa, vì tôi không có nhiều kinh nghiệm với nó, và "1" không nên đặt một sự căng thẳng bộ nhớ lớn trên bất cứ điều gì OP có thể làm. – Svend