Причины или не объявлять функции в операторе if - PullRequest
5 голосов
/ 29 февраля 2020

Мне нужны некоторые подтверждения того, что происходит за экраном.

В MDN есть статья, в которой говорится, что мы не должны объявлять функции на уровне блоков, например, внутри оператора if. Потому что это несовместимо с браузерами и чем-то, что связано с pre-ES2015 (или pre-ES6).

Функция внутри оператора if не будет создана, если условие не выполнено.

Мне было интересно, если условие выполнено, скажем, через 5 минут после загрузки JavaScript и установить синхронно, будет это создать функцию? У него все еще есть память о коде для создания функции, или он выгружается в неиспользуемый код и все такое?

Я хотел бы знать, существует ли функция даже после выполнения оператора if. Это доступно? Как долго это доступно? Это доступно, пока условие if не ложно? Отличается ли результат от ES6 и pre-ES6? Я слышал, что в операторах if нет предыстории ES6.

Например,

if (condition) { function foo() {console.log(“hello world”); } }

Я был сбит с толку после прочтения в MDN статьи на тему «Функции». в разделе «Функции уровня блока в нестрогом коде»: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions

1 Ответ

0 голосов
/ 29 февраля 2020

Если условие верно, скажем, через 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. Также отметьте, за комментарий, что «объявление функции» иногда называют «функцией» утверждение».)

...