Рассмотрим ещё примеры функциональных выражений и передачи функции как значения.
Давайте напишем функцию ask(question, yes, no)
с тремя параметрами: question
– Текст вопроса, yes
– Функция, которая будет вызываться, если ответ будет «Yes». no
– Функция, которая будет вызываться, если ответ будет «No»
Наша функция должна задать вопрос question
и, в зависимости от того, как ответит пользователь, вызвать yes()
или no()
:
function ask(question, yes, no) {
if (confirm(question)) yes()
else no();
}
function showOk() {
alert( "Вы согласны." );
}
function showCancel() {
alert( "Вы отменили выполнение." );
}
// использование: функции showOk, showCancel передаются в качестве аргументов ask
ask("Вы согласны?", showOk, showCancel);
На практике подобные функции очень полезны. Основное отличие «реальной» функции ask
от примера выше будет в том, что она использует более сложные способы взаимодействия с пользователем, чем простой вызов confirm
. В браузерах такие функции обычно отображают красивые диалоговые окна. Но это уже другая история.
Аргументы функции ask
ещё называют функциями-колбэками или просто колбэками.
Ключевая идея в том, что мы передаём функцию и ожидаем, что она вызовется обратно (от англ. «call back» – обратный вызов) когда-нибудь позже, если это будет необходимо. В нашем случае, showOk
становится колбэком’ для ответа «yes», а showCancel
– для ответа «no».
Мы можем переписать этот пример значительно короче, используя Function Expression:
function ask(question, yes, no) {
if (confirm(question)) yes()
else no();
}
ask(
"Вы согласны?",
function() { alert("Вы согласились."); },
function() { alert("Вы отменили выполнение."); }
);
Здесь функции объявляются прямо внутри вызова ask(...)
. У них нет имён, поэтому они называются анонимными. Такие функции недоступны снаружи ask
(потому что они не присвоены переменным), но это как раз то, что нам нужно.
Подобный код, появившийся в нашем скрипте выглядит очень естественно, в духе JavaScript.
Функция – это значение, представляющее «действие»
Обычные значения, такие как строки или числа представляют собой данные. Функции, с другой стороны, можно воспринимать как «действия». Мы можем передавать их из переменной в переменную и запускать, когда захотим.