(Это довольно странно.)
Использование памяти - это действительно проблема, с которой вам нужно иметь дело в текущем состоянии браузера, хотя, если мы не говорим о достаточно большом количестве кода, я не знаю, что размер кода является проблемой (это обычно размер 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;
}
}