Функция в JavaScript – это не магическая языковая структура, а особого типа значение.
Синтаксис, который мы использовали до этого, называется Function Declaration (Объявление Функции):
function sayHi() {
alert( "Привет" );
}
Существует ещё один синтаксис создания функций, который называется Function Expression (Функциональное Выражение).
Оно выглядит вот так:
let sayHi = function() {
alert( "Привет" );
};
В коде выше функция создаётся и явно присваивается переменной, как любое другое значение. По сути без разницы, как мы определили функцию, это просто значение, хранимое в переменной sayHi
.
Смысл обоих примеров кода одинаков: “создать функцию и поместить её значение в переменную sayHi
“.
Мы можем даже вывести это значение с помощью alert
:
function sayHi() {
alert( "Привет" );
}
alert( sayHi ); // выведет код функции
Обратите внимание, что последняя строка не вызывает функцию sayHi
, после её имени нет круглых скобок. Существуют языки программирования, в которых любое упоминание имени функции совершает её вызов. JavaScript – не один из них.
В JavaScript функции – это значения, поэтому мы и обращаемся с ними, как со значениями. Код выше выведет строковое представление функции, которое является её исходным кодом.
Конечно, функция – не обычное значение, в том смысле, что мы можем вызвать его при помощи скобок: sayHi()
.
Но всё же это значение. Поэтому мы можем делать с ним то же самое, что и с любым другим значением.
Мы можем скопировать функцию в другую переменную:
function sayHi() { // (1) создаём
alert( "Привет" );
}
let func = sayHi; // (2) копируем
func(); // Привет // (3) вызываем копию (работает)!
sayHi(); // Привет // прежняя тоже работает (почему бы нет)
Давайте подробно разберём всё, что тут произошло:
- Объявление Function Declaration
(1)
создало функцию и присвоило её значение переменной с именемsayHi
. - В строке
(2)
мы скопировали её значение в переменнуюfunc
. Обратите внимание (ещё раз): нет круглых скобок послеsayHi
. Если бы они были, то выражениеfunc = sayHi()
записало бы результат вызоваsayHi()
в переменнуюfunc
, а не саму функциюsayHi
. - Теперь функция может быть вызвана с помощью обеих переменных
sayHi()
иfunc()
.
Заметим, что мы могли бы использовать и Function Expression для того, чтобы создать sayHi
в первой строке:
let sayHi = function() {
alert( "Привет" );
};
let func = sayHi;
// ...
Результат был бы таким же.
Зачем нужна точка с запятой в конце?
У вас мог возникнуть вопрос: Почему в Function Expression ставится точка с запятой ;
на конце, а в Function Declaration нет:
function sayHi() {
// ...
}
let sayHi = function() {
// ...
};
Ответ прост:
- Нет необходимости в
;
в конце блоков кода и синтаксических конструкций, которые их используют, таких какif { ... }
,for { }
,function f { }
и т.д. - Function Expression использует внутри себя инструкции присваивания
let sayHi = ...;
как значение. Это не блок кода, а выражение с присваиванием. Таким образом, точка с запятой не относится непосредственно к Function Expression, она лишь завершает инструкцию.