Учитывая загрузчик:

function loader(src, callback, fail) { let s = document.head.appendChild(document.createElement('script')); s.type = "text/javascript"; s.src = src; s.onload = function() { callback() s.onload = null; //useful? s = null; //or maybe this? } s.onerror = fail } 

s.onload = null строки s.onload = null GC освобождает память?

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

Вы можете также захотеть удалить элемент s из DOM в обратном вызове, что делает его также сборщиком мусора.

Да, s.onload = null полезен и будет собирать мусор!

Начиная с 2019 года, невозможно явно или программно запускать сборку мусора в JavaScript . Это означает, что он собирает, когда хочет.
Хотя есть случаи, когда установка в null может сделать GC раньше (но не запустить его).

Начиная с 2012 года все современные браузеры выпускают сборщик мусора с меткой и меткой .
Это работает из принципа достижимости :

Каждый объект, недоступный из глобального контекста, удаляется

Периодически метка- разметка обнаруживает и удаляет объект, когда каждая переменная, в которой он хранится, возвращается, переназначается или устанавливается равной нулю . Также в настоящее время нет необходимости рекурсивно устанавливать значение NULL для содержимого, которое не доступно ни для одной переменной — оно все равно собирается меткой-меткой .

Теперь к рассматриваемому коду …

s = null не требуется, потому что переменная очищается в любом случае, когда функция возвращается, замыкание удаляется из стека вызовов, а GC заботится о s .

но все еще есть ссылка на свойство сценариев onload , так как {amp}lt;script onload{amp}gt; является дочерним элементом document.head в DOM, доступном из window !

Содержание callback может быть доступно, но здесь не может быть и речи.

Что если браузеры достаточно умны, чтобы установить s.onload = null внутри? Мы опробуем его, сначала закомментировав его в первом фрагменте, и раскомментировав его во втором фрагменте …

 function fetch(src, callback, fail) { let s = document.head.appendChild(document.createElement('script')); s.type = "text/javascript"; s.src = src; s.onload = function() { callback() //s.onload = null; //useful? } s.onerror = fail } fetch("https://stackoverflow.com", () ={amp}gt; {console.log("Execute onload");}, () ={amp}gt; {console.log("File not found");}) setTimeout(() ={amp}gt; { console.log(document.head.lastChild.onload) },1000) 

Найденный файл выполняется с ошибкой, потому что это не Javascript.
onload выполнена, но не удалена. Код отображается в журнале!
Это доказывает, что следует использовать строку с s.onload = null , например:

 function fetch(src, callback, fail) { let s = document.head.appendChild(document.createElement('script')); s.type = "text/javascript"; s.src = src; s.onload = function() { callback() s.onload = null; //useful! } s.onerror = fail } fetch("https://stackoverflow.com", () ={amp}gt; {console.log("Execute onload");}, () ={amp}gt; {console.log("File not found");}) setTimeout(() ={amp}gt; { console.log(document.head.lastChild.onload) },1000)