Самоуничтожение функции Javascript - Как это работает? - PullRequest
18 голосов
/ 25 июля 2011

Итак, я нашел этот кусок кода, и он, очевидно, работает (как он работал в течение многих лет):

window[someMethod] = function (tmp) {
    callback({prop:"val"}, tmp); 

    // Garbage collect
    window[someMethod] = undefined;
    try { 
        delete window[someMethod]; 
    } 
    catch (e) { }
    if (head) { 
        head.removeChild(script); 
    }   
    // head refers to DOM head elem and script refers to some script file elem
};

Интересно узнать, как он работает?

  1. Как он может установить себе undefined в своем теле и try на delete сам?
  2. Знает ли браузер, что не выполняет undefined и delete пока звонок не закончится?И как?
  3. Если браузер сразу его удалит, то что будет после?Последняя строка запускается?
  4. Наконец, вы, ребята, видите эту утечку памяти?Если да, то как?

Ответы [ 3 ]

21 голосов
/ 25 июля 2011
  1. Он не устанавливает сам по себе на неопределенное, он устанавливает ссылку на себя на неопределенное.Если вы думаете о функции как о блоке кода в памяти, этот блок кода в этом случае не удаляется, а просто ссылается на него.Вы никогда явно не удаляете что-либо в JavaScript, вы просто удаляете ссылки на него и оставляете это сборщику мусора для очистки.Обратите внимание, что это может не относиться к реальному коду, просто кучи объектов, так как все зависит от того, как обработать его (интерпретировать, скомпилировать, выполнить на счетах, что угодно)
  2. На основании этогоПо логике, когда функция выполняется, исходная ссылка на нее больше не требуется, так как она была необходима только первоначально для передачи на нее выполнения.
  3. Вы неправильно понимаете оценку JS как требующую ссылку на нее для каждого оператора,По всей вероятности, этот метод был скомпилирован Just-In-Time и теперь выполняется так же, как и любая другая не-JS-функция.
  4. В приведенном выше коде нет утечек памяти.

Надеюсь, это имеет смысл.

3 голосов
/ 25 июля 2011

Помните, что вы не можете явно удалить что-либо в Javascript.Все, что вы можете сделать, это удалить все ссылки на него и позволить сборщику мусора удалить его в следующем цикле.К концу этой функции сама функция все еще находится в памяти, но внешних ссылок на нее нет.В следующий раз, когда GC запустится, он обнаружит это и освободит свою память.

2 голосов
/ 25 июля 2011
Окно

[someMethod] является просто ссылкой. Удаляется только ссылка, а не сама функция. Как только функция завершена и все ссылки на нее удалены, сборщик мусора должен позаботиться об этом, избегая утечек памяти.

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