Function expression и Function declaration в JavaScript

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

Первый способ - это просто объявить функцию через function, сразу задав ее имя:

function func() { alert('!'); } func(); // выведет '!'

Второй способ - это сделать безымянную функцию и записать ее в какую-либо переменную:

let func = function() { alert('!'); }; func(); // выведет '!'

По научному первый способ называется Function Declaration (объявление функции), а второй - Function Expression (функциональное выражение).

Определите, является ли представленная функция Function Declaration или Function Expression:

function func() { alert('!'); }

Определите, является ли представленная функция Function Declaration или Function Expression:

let func = function() { alert('!'); }

Разница

Оба способа объявления функции эквивалентны, но есть существенная разница: функции, объявленные как Function Declaration, будут доступны, даже если обратится к ним до того, как они были объявлены.

Смотрите пример:

// Обращаемся к функции до ее объявления: func(); //выведет '!' function func() { alert('!'); }

А функциональные выражения создаются в момент выполнения кода и недоступны выше. Поэтому такой код выдаст ошибку:

func(); //ошибка, такой функции еще нет! let func = function() { alert('!'); };

Создайте функцию как Function Declaration. Проверьте то, что она будет доступна выше места своего объявления.

Создайте функцию как Function Expression. Проверьте то, что она не будет доступна выше места своего объявления.

Объяснение работы Function Declaration

Почему функции, созданные как Function Declaration доступны до объявления?

Как вы должны уже знать, интерпретатор JavaScript обрабатывает код строка за строкой. Функции, однако, являются исключениями: интерпретатор вначале пробегается по всему документу с кодом и ищет все функции, объявленные как Function Declaration, и только потом начинает выполнять код документа построчно.

Функции, созданные как Function Expression, создаются в тот момент, когда до них доходит интерпретатор. Поэтому они и недоступны выше места своего объявления.

Точка с запятой

При объявлении функции как Function Declaration после фигурной скобки } точка с запятой не ставится:

function func() { alert('!'); }

Если же функция объявлена Function Expression, то после } ставится точка с запятой:

let func = function() { alert('!'); };

Почему: потому что в JavaScript любое выражение должно заканчиваться точкой с запятой, а в данном случае у нас как раз-таки выражение.

Эта точка с запятой не обязательна, так как JavaScript вообще разрешает их не ставить, но желательна. Ставьте всегда:)

Расставьте точки с запятой во всех необходимых местах:

let func1 = function() {alert('!')} let func2 = function() { alert('!') } function func3() { alert('!') }