Почему мы не можем сразу вызвать объявление функции?

Почему мы не можем немедленно вызвать объявление функции?

Причина в том, как обрабатывается код ECMAScript.

Во время инициализации сначала обрабатываются объявления функций, а затем объявления переменных (этот процесс часто называют «подъемом»). Затем начинается казнь.

Выражения функций оцениваются во время выполнения.

Таким образом, вы не можете сразу выполнять объявления функций, потому что даже переменных еще не существует, и другой код, от которого может зависеть функция, также не был выполнен.

Рассмотрим что-нибудь простое:

 foo(); // shows undefined var randomNumber = function() { // function expression return Math.random(); }(); // () makes it an IIFE foo(); // shows value assigned to randomNumber function foo() { // function declaration alert(randomNumber); } 

Функция foo существует до randomNumber (несмотря на последовательность кода), поэтому попытка ее немедленного выполнения вызовет ошибку ссылки. После завершения инициализации были объявлены как foo, так и randomNumber .

Код RHS назначения для randomNumber анализируется во время инициализации на предмет синтаксических ошибок, но не выполняется до фазы выполнения.

Теперь выполнение начинается, выражение функции выполняется и присваивает значение randomNumber, поэтому, когда вызывается foo , randomNumber существует и имеет любое значение, возвращаемое выражением функции в RHS.

Понравилась статья? Поделиться с друзьями:
JavaScript & TypeScript
Adblock
detector