Условное объявление функции
В некоторых случаях «дополнительное удобство» Function Declaration может сослужить плохую службу. Например, попробуем, в зависимости от условия, объявить функцию sayHi по‑разному:
var age = +prompt("Сколько вам лет?", 20);
if (age >= 18) { function sayHi() {
alert( 'Прошу вас!' );
}
} else {
function sayHi() {
alert( 'До 18 нельзя' );
}
}
sayHi();
Function Declaration при use strict видны только внутри блока, в котором объявлены. Так как код в учебнике выполняется в режиме use strict , то будет ошибка.
А что, если использовать Function Expression?
var age = prompt('Сколько вам лет?'); var sayHi;
if (age >= 18) {
sayHi = function() { alert( 'Прошу Вас!' );
}
} else {
sayHi = function() { alert( 'До 18 нельзя' );
}
}
sayHi();
Или даже так:
var age = prompt('Сколько вам лет?');
var sayHi = (age >= 18) ?
function() { alert('Прошу Вас!'); } :
function() { alert('До 18 нельзя'); }; sayHi();
Оба этих варианта работают правильно, поскольку, в зависимости от условия, создаётся именно та функция, которая нужна.
Анонимные функции
Взглянем ещё на один пример – функцию ask(question, yes, no) с тремя параметрами:
question
Строка‑вопрос
yes
Функция
no
Функция
Она выводит вопрос на подтверждение question и, в зависимости от согласия пользователя, вызывает функцию yes() или no() :
function ask(question, yes, no) {
if (confirm(question)) yes() else no();
}
function showOk() {
alert( "Вы согласились." );
}
function showCancel() {
alert( "Вы отменили выполнение." );
}
// использование
ask("Вы согласны?", showOk, showCancel);
Какой‑то очень простой код, не правда ли? Зачем, вообще, может понадобиться такая ask ?
…Оказывается, при работе со страницей такие функции как раз очень востребованы, только вот спрашивают они не простым confirm , а выводят более красивое окно с вопросом и могут интеллектуально обработать ввод посетителя. Но это всё потом, когда перейдём к работе с интерфейсом.
Здесь же обратим внимание на то, что то же самое можно написать более коротко:
function ask(question, yes, no) { if (confirm(question)) yes() else no();
}
ask(
"Вы согласны?",
function() { alert("Вы согласились."); }, function() { alert("Вы отменили выполнение."); }
);
Здесь функции объявлены прямо внутри вызова ask(...) , даже без присвоения им имени.
Функциональное выражение, которое не записывается в переменную, называют анонимной функцией .
Действительно, зачем нам записывать функцию в переменную, если мы не собираемся вызывать её ещё раз? Можно просто объявить непосредственно там, где функция нужна.
Такого рода код возникает естественно, он соответствует «духу» JavaScript.
Do'stlaringiz bilan baham: |