Подтвердить что ты не робот

Саморазрушающаяся функция Javascript - как это работает?

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

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
};

Любопытно узнать, как это работает?

  • Как он может установить undefined в своем теле и try на delete сам?
  • Знает ли браузер, что он не выполняет undefined и delete, пока вызов не будет завершен? И как?
  • Если браузер удаляет его сразу, то что происходит после? Выполняется ли последняя строка?
  • Наконец, вы, ребята, видите эту утечку памяти? Если да, то как?
4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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