ФÑнкÑÐ¸Ñ Ð² JavaScript â ÑÑо не магиÑеÑÐºÐ°Ñ ÑзÑÐºÐ¾Ð²Ð°Ñ ÑÑÑÑкÑÑÑа, а оÑобого Ñипа знаÑение.
СинÑакÑиÑ, коÑоÑÑй Ð¼Ñ Ð¸ÑполÑзовали до ÑÑого, назÑваеÑÑÑ Function Declaration (ÐбÑÑвление ФÑнкÑии):
function sayHi() {
alert( "ÐÑивеÑ" );
}
СÑÑеÑÑвÑÐµÑ ÐµÑÑ Ð¾Ð´Ð¸Ð½ ÑинÑакÑÐ¸Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑÑнкÑий, коÑоÑÑй назÑваеÑÑÑ Function Expression (ФÑнкÑионалÑное ÐÑÑажение).
ÐаннÑй ÑинÑакÑÐ¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ Ð½Ð°Ð¼ ÑоздаваÑÑ Ð½Ð¾Ð²ÑÑ ÑÑнкÑÐ¸Ñ Ð² ÑеÑедине лÑбого вÑÑажениÑ.
ÐÑо вÑглÑÐ´Ð¸Ñ ÑледÑÑÑим обÑазом:
let sayHi = function() {
alert( "ÐÑивеÑ" );
};
ÐдеÑÑ Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ видеÑÑ Ð¿ÐµÑеменнÑÑ sayHi, полÑÑаÑÑÑÑ Ð·Ð½Ð°Ñение, новÑÑ ÑÑнкÑиÑ, ÑозданнÑÑ ÐºÐ°Ðº function() { alert("ÐÑивеÑ"); }.
ÐоÑколÑÐºÑ Ñоздание ÑÑнкÑии пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð² конÑекÑÑе вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿ÑиÑÐ²Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ (Ñ Ð¿Ñавой ÑÑоÑÐ¾Ð½Ñ Ð¾Ñ =), ÑÑо Function Expression.
ÐбÑаÑиÑе внимание, ÑÑо поÑле клÑÑевого Ñлова function Ð½ÐµÑ Ð¸Ð¼ÐµÐ½Ð¸. ÐÐ»Ñ Function Expression допÑÑкаеÑÑÑ ÐµÐ³Ð¾ оÑÑÑÑÑÑвие.
ÐдеÑÑ Ð¼Ñ ÑÑÐ°Ð·Ñ Ð¿ÑиÑваиваем ÐµÑ Ð¿ÐµÑеменной, Ñак ÑÑо ÑмÑÑл ÑÑиÑ
пÑимеÑов кода один и ÑÐ¾Ñ Ð¶Ðµ: «ÑоздаÑÑ ÑÑнкÑÐ¸Ñ Ð¸ помеÑÑиÑÑ ÐµÑ Ð² пеÑеменнÑÑ 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() { // (1) ÑоздаÑм
alert( "ÐÑивеÑ" );
};
let func = sayHi;
// ...
ÐÑÑ Ð±ÑÐ´ÐµÑ ÑабоÑаÑÑ Ñак же.
У Ð²Ð°Ñ Ð¼Ð¾Ð³ возникнÑÑÑ Ð²Ð¾Ð¿ÑоÑ: ÐоÑÐµÐ¼Ñ Ð² Function Expression ÑÑавиÑÑÑ ÑоÑка Ñ Ð·Ð°Ð¿ÑÑой ; на конÑе, а в Function Declaration неÑ:
function sayHi() {
// ...
}
let sayHi = function() {
// ...
};
ÐÑÐ²ÐµÑ Ð¿ÑоÑÑ: Function Expression ÑоздаÑÑÑÑ Ð·Ð´ÐµÑÑ ÐºÐ°Ðº function(...) {...} внÑÑÑи вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿ÑиÑваиваниÑ: let sayHi = â¦;. ТоÑÐºÑ Ñ Ð·Ð°Ð¿ÑÑой ; ÑекомендÑеÑÑÑ ÑÑавиÑÑ Ð² конÑе вÑÑажениÑ, она не ÑвлÑеÑÑÑ ÑаÑÑÑÑ ÑинÑакÑиÑа ÑÑнкÑии.
ТоÑка Ñ Ð·Ð°Ð¿ÑÑой нÑжна Ñам Ð´Ð»Ñ Ð±Ð¾Ð»ÐµÐµ пÑоÑÑого пÑиÑваиваниÑ, Ñакого как let sayHi = 5;, а Ñакже Ð´Ð»Ñ Ð¿ÑиÑÐ²Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ ÑÑнкÑии.
ФÑнкÑии-«колбÑки»
ÐавайÑе ÑаÑÑмоÑÑим болÑÑе пÑимеÑов пеÑедаÑи ÑÑнкÑии в виде знаÑÐµÐ½Ð¸Ñ Ð¸ иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑÑнкÑионалÑнÑÑ Ð²ÑÑажений.
ÐавайÑе напиÑем ÑÑнкÑÐ¸Ñ 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. РбÑаÑзеÑаÑ
Ñакие ÑÑнкÑии обÑÑно оÑобÑажаÑÑ ÐºÑаÑивÑе диалоговÑе окна. Ðо ÑÑо Ñже дÑÑÐ³Ð°Ñ Ð¸ÑÑоÑиÑ.
ÐÑгÑменÑÑ showOk и showCancel ÑÑнкÑии 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.
ÐбÑÑнÑе знаÑениÑ, Ñакие как ÑÑÑоки или ÑиÑла пÑедÑÑавлÑÑÑ Ñобой даннÑе.
ФÑнкÑии, Ñ Ð´ÑÑгой ÑÑоÑонÑ, можно воÑпÑинимаÑÑ ÐºÐ°Ðº дейÑÑвиÑ.
ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ пеÑедаваÑÑ Ð¸Ñ Ð¸Ð· пеÑеменной в пеÑеменнÑÑ Ð¸ запÑÑкаÑÑ, когда Ð·Ð°Ñ Ð¾Ñим.
Function Expression в ÑÑавнении Ñ Function Declaration
ÐавайÑе ÑазбеÑÑм клÑÑевÑе оÑлиÑÐ¸Ñ Function Declaration Ð¾Ñ Function Expression.
Ðо-пеÑвÑÑ , ÑинÑакÑиÑ: как оÑлиÑиÑÑ Ð¸Ñ Ð´ÑÑг Ð¾Ñ Ð´ÑÑга в коде.
-
Function Declaration: ÑÑнкÑÐ¸Ñ Ð¾Ð±ÑÑвлÑеÑÑÑ Ð¾ÑделÑной конÑÑÑÑкÑией «functionâ¦Â» в оÑновном поÑоке кода.
// Function Declaration function sum(a, b) { return a + b; } -
Function Expression: ÑÑнкÑиÑ, ÑÐ¾Ð·Ð´Ð°Ð½Ð½Ð°Ñ Ð²Ð½ÑÑÑи дÑÑгого вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ ÑинÑакÑиÑеÑкой конÑÑÑÑкÑии. Рданном ÑлÑÑае ÑÑнкÑÐ¸Ñ ÑоздаÑÑÑÑ Ð² пÑавой ÑаÑÑи «вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿ÑиÑваиваниÑ»
=:// Function Expression let sum = function(a, b) { return a + b; };
Ðолее Ñонкое оÑлиÑие ÑоÑÑÐ¾Ð¸Ñ Ð² Ñом, когда ÑоздаÑÑÑÑ ÑÑнкÑÐ¸Ñ Ð´Ð²Ð¸Ð¶ÐºÐ¾Ð¼ JavaScript.
Function Expression ÑоздаÑÑÑÑ, когда вÑполнение Ð´Ð¾Ñ Ð¾Ð´Ð¸Ñ Ð´Ð¾ него, и заÑем Ñже Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ.
ÐоÑле Ñого, как поÑок вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð´Ð¾ÑÑÐ¸Ð³Ð½ÐµÑ Ð¿Ñавой ÑаÑÑи вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿ÑиÑÐ²Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ let sum = function⦠â Ñ ÑÑого моменÑа, ÑÑнкÑÐ¸Ñ ÑÑиÑаеÑÑÑ Ñозданной и Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸ÑполÑзована (пÑиÑвоена пеÑеменной, вÑзвана и Ñ.д. ).
С Function Declaration вÑÑ Ð¸Ð½Ð°Ñе.
Function Declaration Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²Ñзвана ÑанÑÑе, Ñем она обÑÑвлена.
ÐÑÑгими Ñловами, когда движок JavaScript гоÑовиÑÑÑ Ð²ÑполнÑÑÑ ÑкÑÐ¸Ð¿Ñ Ð¸Ð»Ð¸ блок кода, пÑежде вÑего он иÑÐµÑ Ð² нÑм Function Declaration и ÑоздаÑÑ Ð²Ñе Ñакие ÑÑнкÑии. Ðожно ÑÑиÑаÑÑ ÑÑÐ¾Ñ Ð¿ÑоÑеÑÑ Â«ÑÑадией иниÑиализаÑии».
Ð ÑолÑко поÑле Ñого, как вÑе обÑÑÐ²Ð»ÐµÐ½Ð¸Ñ Function Declaration бÑдÑÑ Ð¾Ð±ÑабоÑанÑ, пÑодолжиÑÑÑ Ð²Ñполнение.
Ð ÑезÑлÑÑаÑе ÑÑнкÑии, ÑозданнÑе как Function Declaration, могÑÑ Ð±ÑÑÑ Ð²ÑÐ·Ð²Ð°Ð½Ñ ÑанÑÑе ÑÐ²Ð¾Ð¸Ñ Ð¾Ð¿Ñеделений.
ÐапÑимеÑ, Ñак бÑÐ´ÐµÑ ÑабоÑаÑÑ:
sayHi("ÐаÑÑ"); // ÐÑивеÑ, ÐаÑÑ
function sayHi(name) {
alert( `ÐÑивеÑ, ${name}` );
}
ФÑнкÑÐ¸Ñ sayHi бÑла Ñоздана, когда движок JavaScript подгоÑавливал ÑкÑÐ¸Ð¿Ñ Ðº вÑполнениÑ, и ÑÐ°ÐºÐ°Ñ ÑÑнкÑÐ¸Ñ Ð²Ð¸Ð´Ð½Ð° повÑÑÐ´Ñ Ð² ÑÑом ÑкÑипÑе.
â¦ÐÑли Ð±Ñ ÑÑо бÑло Function Expression, Ñо Ñакой код вÑзвал Ð±Ñ Ð¾ÑибкÑ:
sayHi("ÐаÑÑ"); // оÑибка!
let sayHi = function(name) { // (*) магии болÑÑе неÑ
alert( `ÐÑивеÑ, ${name}` );
};
ФÑнкÑии, обÑÑвленнÑе пÑи помоÑи Function Expression, ÑоздаÑÑÑÑ Ñогда, когда вÑполнение доÑ
Ð¾Ð´Ð¸Ñ Ð´Ð¾ ниÑ
. ÐÑо ÑлÑÑиÑÑÑ ÑолÑко на ÑÑÑоке, помеÑенной звÑздоÑкой (*). СлиÑком поздно.
ÐÑÑ Ð¾Ð´Ð½Ð° Ð²Ð°Ð¶Ð½Ð°Ñ Ð¾ÑобенноÑÑÑ Function Declaration заклÑÑаеÑÑÑ Ð² Ð¸Ñ Ð±Ð»Ð¾Ñной облаÑÑи видимоÑÑи.
Ð ÑÑÑогом Ñежиме, когда Function Declaration наÑ
одиÑÑÑ Ð² блоке {...}, ÑÑнкÑÐ¸Ñ Ð´Ð¾ÑÑÑпна везде внÑÑÑи блока. Ðо не ÑнаÑÑжи него.
ÐÐ»Ñ Ð¿ÑимеÑа давайÑе пÑедÑÑавим, ÑÑо нам нÑжно обÑÑвиÑÑ ÑÑнкÑÐ¸Ñ welcome() в завиÑимоÑÑи Ð¾Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿ÐµÑеменной age, коÑоÑое Ð¼Ñ Ð¿Ð¾Ð»ÑÑим во вÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð´Ð°. РзаÑем запланиÑÑем иÑполÑзоваÑÑ ÐµÑ ÐºÐ¾Ð³Ð´Ð°-нибÑÐ´Ñ Ð² бÑдÑÑем.
ÐÑли Ð¼Ñ Ð¿Ð¾Ð¿ÑобÑем иÑполÑзоваÑÑ Function Declaration, ÑÑо не заÑабоÑÐ°ÐµÑ Ñак, как задÑмÑвалоÑÑ:
let age = prompt("СколÑко Ðам леÑ?", 18);
// в завиÑимоÑÑи Ð¾Ñ ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð¾Ð±ÑÑвлÑем ÑÑнкÑиÑ
if (age < 18) {
function welcome() {
alert("ÐÑивеÑ!");
}
} else {
function welcome() {
alert("ÐдÑавÑÑвÑйÑе!");
}
}
// ...не ÑабоÑаеÑ
welcome(); // Error: welcome is not defined
ÐÑо пÑоизоÑло, Ñак как обÑÑвление Function Declaration видимо ÑолÑко внÑÑÑи блока кода, в коÑоÑом ÑаÑполагаеÑÑÑ.
ÐÐ¾Ñ ÐµÑÑ Ð¾Ð´Ð¸Ð½ пÑимеÑ:
let age = 16; // возÑмÑм Ð´Ð»Ñ Ð¿ÑимеÑа 16
if (age < 18) {
welcome(); // \ (вÑполниÑÑÑ)
// |
function welcome() { // |
alert("ÐÑивеÑ!"); // | Function Declaration доÑÑÑпно
} // | во вÑÑм блоке кода, в коÑоÑом обÑÑвлено
// |
welcome(); // / (вÑполниÑÑÑ)
} else {
function welcome() {
alert("ÐдÑавÑÑвÑйÑе!");
}
}
// здеÑÑ ÑигÑÑÐ½Ð°Ñ Ñкобка закÑÑваеÑÑÑ,
// поÑÑÐ¾Ð¼Ñ Function Declaration, ÑозданнÑе внÑÑÑи блока кода вÑÑе -- недоÑÑÑÐ¿Ð½Ñ Ð¾ÑÑÑда.
welcome(); // ÐÑибка: welcome is not defined
ЧÑо можно ÑделаÑÑ, ÑÑÐ¾Ð±Ñ welcome бÑла видима ÑнаÑÑжи if?
ÐеÑнÑм подÑ
одом бÑÐ´ÐµÑ Ð²Ð¾ÑполÑзоваÑÑÑÑ ÑÑнкÑией, обÑÑвленной пÑи помоÑи Function Expression, и пÑиÑвоиÑÑ Ð·Ð½Ð°Ñение welcome пеÑеменной, обÑÑвленной ÑнаÑÑжи if, ÑÑо обеÑпеÑÐ¸Ñ Ð½Ð°Ð¼ нÑжнÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑÑ.
Такой код заÑабоÑаеÑ, как ожидалоÑÑ:
let age = prompt("СколÑко Ðам леÑ?", 18);
let welcome;
if (age < 18) {
welcome = function() {
alert("ÐÑивеÑ!");
};
} else {
welcome = function() {
alert("ÐдÑавÑÑвÑйÑе!");
};
}
welcome(); // ÑепеÑÑ Ð²ÑÑ Ð² поÑÑдке
Ðли Ð¼Ñ Ð¼Ð¾Ð³Ð»Ð¸ Ð±Ñ ÑпÑоÑÑиÑÑ ÑÑо еÑÑ ÑилÑнее, иÑполÑзÑÑ ÑÑловнÑй опеÑаÑÐ¾Ñ ?:
let age = prompt("СколÑко Ðам леÑ?", 18);
let welcome = (age < 18) ?
function() { alert("ÐÑивеÑ!"); } :
function() { alert("ÐдÑавÑÑвÑйÑе!"); };
welcome(); // ÑепеÑÑ Ð²ÑÑ Ð² поÑÑдке
Ðак пÑавило, еÑли нам понадобилаÑÑ ÑÑнкÑиÑ, в пеÑвÑÑ Ð¾ÑеÑÐµÐ´Ñ Ð½Ñжно ÑаÑÑмаÑÑиваÑÑ ÑинÑакÑÐ¸Ñ Function Declaration, коÑоÑÑй Ð¼Ñ Ð¸ÑполÑзовали до ÑÑого. Ðн даÑÑ Ð½Ð°Ð¼ болÑÑе ÑÐ²Ð¾Ð±Ð¾Ð´Ñ Ð² Ñом, как Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ оÑганизовÑваÑÑ ÐºÐ¾Ð´. ФÑнкÑии, обÑÑвленнÑе Ñаким обÑазом, можно вÑзÑваÑÑ Ð´Ð¾ Ð¸Ñ Ð¾Ð±ÑÑвлениÑ.
Также ÑÑнкÑии вида function f(â¦) {â¦} ÑÑÑÑ Ð±Ð¾Ð»ÐµÐµ замеÑÐ½Ñ Ð² коде, Ñем let f = function(â¦) {â¦}. Function Declaration легÑе «ловÑÑÑÑ Ð³Ð»Ð°Ð·Ð°Ð¼Ð¸Â».
â¦Ðо еÑли Function Declaration нам не Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð¸Ñ Ð¿Ð¾ какой-Ñо пÑиÑине, или нам нÑжно ÑÑловное обÑÑвление (Ð¼Ñ ÑаÑÑмоÑÑели ÑÑо в пÑимеÑе вÑÑе), Ñо ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ Function Expression.
ÐÑого
- ФÑнкÑии â ÑÑо знаÑениÑ. Ðни могÑÑ Ð±ÑÑÑ Ð¿ÑиÑвоенÑ, ÑкопиÑÐ¾Ð²Ð°Ð½Ñ Ð¸Ð»Ð¸ обÑÑÐ²Ð»ÐµÐ½Ñ Ð² лÑбом меÑÑе кода.
- ÐÑли ÑÑнкÑÐ¸Ñ Ð¾Ð±ÑÑвлена как оÑделÑÐ½Ð°Ñ Ð¸Ð½ÑÑÑÑкÑÐ¸Ñ Ð² оÑновном поÑоке кода, Ñо ÑÑо âFunction Declarationâ.
- ÐÑли ÑÑнкÑÐ¸Ñ Ð±Ñла Ñоздана как ÑаÑÑÑ Ð²ÑÑажениÑ, Ñо ÑÑо âFunction Expressionâ.
- Function Declaration обÑабаÑÑваÑÑÑÑ Ð¿ÐµÑед вÑполнением блока кода. Ðни Ð²Ð¸Ð´Ð½Ñ Ð²Ð¾ вÑÑм блоке.
- ФÑнкÑии, обÑÑвленнÑе пÑи помоÑи Function Expression, ÑоздаÑÑÑÑ ÑолÑко когда поÑок вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð´Ð¾ÑÑÐ¸Ð³Ð°ÐµÑ Ð¸Ñ .
РболÑÑинÑÑве ÑлÑÑаев, когда нам нÑжно обÑÑвиÑÑ ÑÑнкÑиÑ, Function Declaration пÑедпоÑÑиÑелÑнее, Ñ.к ÑÑнкÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð²Ð¸Ð´Ð½Ð° до Ñвоего обÑÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð² коде. ÐÑо даÑÑ Ð½Ð°Ð¼ болÑÑе гибкоÑÑи в оÑганизаÑии кода, и, как пÑавило, Ð´ÐµÐ»Ð°ÐµÑ ÐµÐ³Ð¾ более ÑиÑабелÑнÑм.
ÐÑÑ Ð¾Ð´Ñ Ð¸Ð· ÑÑого, Ð¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸ÑполÑзоваÑÑ Function Expression ÑолÑко Ñогда, когда Function Declaration не Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð¸Ñ Ð´Ð»Ñ Ð½Ð°Ñей задаÑи. ÐÑ ÑаÑÑмоÑÑели неÑколÑко ÑÐ°ÐºÐ¸Ñ Ð¿ÑимеÑов в ÑÑой главе, и Ñвидим еÑÑ Ð±Ð¾Ð»ÑÑе в бÑдÑÑем.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)