Если условие верно, скажем, через 5 минут после загрузки и установки синхронно JavaScript, будет ли она создавать функцию?
Функция будет создана, как только if
запускается немедленно.
У него все еще есть память о коде для создания функции, или она сбрасывается в неиспользуемый код и все такое?
Я бы хотелось бы знать, существует ли функция до сих пор даже после выполнения оператора if. Это доступно? Как долго это доступно?
Это поведение будет одинаковым независимо от того, объявлена ли функция в блоке if
или нет: если ничто не может ссылаться на функцию в будущем (например, , если блок заканчивается и ничто внутри блока не имеет ссылки на функцию), он в конечном итоге будет собираться мусором. Функция может «существовать» в памяти какое-то время, пока G C не запустится.
Например, должно быть ясно, что следующая функция должна всегда существовать, по крайней мере, до перезагрузки страницы :
// IIFE, to get off the top level
(() => {
if (true) {
function foo() {
console.log('clicked');
}
window.addEventListener('click', foo);
}
})();
Это потому, что addEventListener
передана ссылка на функцию.
Но следующая foo
функция получит G C 'd (может быть, через секунду или несколько после загрузки страницы - это зависит от базового движка и не отображается Javascript):
// IIFE, to get off the top level
(() => {
if (true) {
function foo() {
console.log('clicked');
}
}
})();
Если ничто не сохранило ссылку на функцию к моменту завершения блока, который определяет область действия переменной, функция не будет доступна нигде и будет GCd.
Остальная часть вопроса выглядит по сути так же, как: «где можно ссылаться на функцию», что лучше всего описано в ответе Берги здесь . Это немного сложно, и поведение отличается в зависимости от того, используете ли вы строгий режим, версию среды ES и саму среду (реализации не всегда соответствуют спецификации).
Для предсказуемого, легко читаемого кода, вероятно, лучше всего просто никогда не использовать объявления функций в не функциональных блоках; объявления функций используются только тогда, когда они находятся непосредственно внутри функциональных блоков.
(Обратите внимание, что функция выражений , где функция используется в качестве значения и передается чему-либо или сразу вызывается или явно назначается переменной, не совпадают с объявлениями функций - с функциональными выражениями все в порядке, это просто странное поведение объявлений функций, которое проблематично c. Также отметьте, за комментарий, что «объявление функции» иногда называют «функцией» утверждение».)