Динамично загруженный JavaScript может быть разгружен?

Когда они стреляют?

window.onload

  • По умолчанию, это запущено, когда вся страница загружается, включая [1 127] ее содержание (изображения, CSS, сценарии, и т.д.).

В некоторых браузерах это теперь берет на себя роль по document.onload и стреляет, когда DOM готов также.

document.onload

  • Это называют, когда DOM готов, который может быть предшествующий к изображениям, и другое внешнее содержание загружается.

, Как хорошо они поддерживаются?

window.onload, кажется, наиболее широко поддерживается. На самом деле некоторые самые современные браузеры в некотором смысле заменили document.onload window.onload.

проблемы Поддержки браузера наиболее вероятны причина, почему многие люди начинают пользоваться библиотеками такой как [1 113] jQuery для обработки проверки документ, являющийся готовым, как так:

$(document).ready(function() { /* code here */ });
$(function() { /* code here */ });

В целях истории. window.onload по сравнению с body.onload:

А подобный вопрос задали на [1 114] codingforums некоторое время назад относительно использования window.onload более чем [1 110]. Результат, казалось, был, что необходимо использовать window.onload, потому что хорошо разделить структуру от действия.

12
задан Andy 28 August 2009 в 13:11
поделиться

6 ответов

Вы могли бы пойти с более объектно-ориентированным подходом и построить модель таким образом, чтобы каждый блок блоков javascript входил как свои собственные объекты, со своими собственными методы. После его выгрузки вы просто устанавливаете для этого объекта значение null .

14
ответ дан 2 December 2019 в 05:28
поделиться

Race conditions.

These are one of the few things that still sends a shiver down my spine when it comes up in debugging (or in the issue tracker). Inherently horrible to debug, and extremely easy to create. The three most common causes of bugs in my C++ software have been race conditions, reliance on uninitialised memory, and reliance on static constructor order.

And if you don't know what race conditions are, chances are they're the cause of your instability ;)

Обратите внимание, что код вне функций запускается немедленно.

Если вы не передаете никаких ссылок на то, что находится внутри замыкания, ни на что за его пределами, тогда 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;
    }
}
9
ответ дан 2 December 2019 в 05:28
поделиться

Если вас беспокоят утечки памяти, вам нужно убедиться, что в коде, который вы хотите удалить, нет обработчиков событий, ссылающихся на все еще существующее дерево dom.

Это может быть что вам нужно вести список всех обработчиков событий, добавленных вашим кодом, и перед выгрузкой пройтись по ним и удалить обработчики событий.

Я никогда не делал этого таким образом, я всегда беспокоюсь, когда удаляю узлы, которые все еще ссылка.

Вот хорошая статья об утечках памяти в javascript: http://javascript.crockford.com/memory/leak.html

1
ответ дан 2 December 2019 в 05:28
поделиться

Если вы сохраняете оцененный код в пространствах имен, например:

var MYAPP = {
    myFunc: function(a) { ... }
}

«Освобождение» всего этого должно быть таким же простым, как установка MYPP на какое-то случайное значение, аля

MYAPP = 1

Это действительно зависит от того, что нет других средств ссылки на переменную, что нетривиально

3
ответ дан 2 December 2019 в 05:28
поделиться

Как насчет загрузки файлов JS в iframe? Затем (теоретически, никогда не тестировал это сам) вы можете удалить iframe из DOM и удалить «память», которую он использует.

Я думаю ... или надеюсь ...

1
ответ дан 2 December 2019 в 05:28
поделиться

У интерпретаторов JavaScript есть сборщики мусора. Другими словами, если вы ни на что не ссылаетесь, они не будут храниться.

Одна из причин, по которой JSON хорошо использовать с функцией обратного вызова (JSONP).

пример, если ваш HTTP-ответ для каждого JS:

callback({status: '1', resp: [resp here..]});

И если callback () не создает ссылку на объект JSON, переданный в качестве аргумента, он будет удален после завершения функции.

Если вам действительно нужно сделать ссылку, то вам, вероятно, по какой-то причине понадобятся эти данные - иначе вы бы / не должны были ссылаться на них в первую очередь.

Методы, упомянутые для объектов пространства имен, просто создают ссылку, которая будет сохраняться до тех пор, пока счетчик ссылок не станет равным 0. Другими словами, вы должны отслеживать каждую ссылку и удалять ее позже, что может быть сложно, когда у вас есть замыкания и ссылки из DOM. Всего одна ссылка сохранит объект в памяти, а некоторые простые операции могут создавать ссылки без вашего ведома.

0
ответ дан 2 December 2019 в 05:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: