Ð JavaScript ÑÑнкÑÐ¸Ñ ÑвлÑеÑÑÑ Ð·Ð½Ð°Ñением, Ñаким же как ÑÑÑока или ÑиÑло.
Ðак и лÑбое знаÑение, обÑÑвленнÑÑ ÑÑнкÑÐ¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ вÑвеÑÑи, Ð²Ð¾Ñ Ñак:
function sayHi() {
alert( "ÐÑивеÑ" );
}
alert( sayHi ); // вÑÐ²ÐµÐ´ÐµÑ ÐºÐ¾Ð´ ÑÑнкÑии
ÐбÑаÑим внимание на Ñо, ÑÑо в поÑледней ÑÑÑоке поÑле sayHi Ð½ÐµÑ Ñкобок. То еÑÑÑ, ÑÑнкÑÐ¸Ñ Ð½Ðµ вÑзÑваеÑÑÑ, а пÑоÑÑо вÑводиÑÑÑ Ð½Ð° ÑкÑан.
ФÑнкÑÐ¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ ÑкопиÑоваÑÑ Ð² дÑÑгÑÑ Ð¿ÐµÑеменнÑÑ:
function sayHi() { // (1)
alert( "ÐÑивеÑ" );
}
var func = sayHi; // (2)
func(); // ÐÑÐ¸Ð²ÐµÑ // (3)
sayHi = null;
sayHi(); // оÑибка (4)
- ÐбÑÑвление
(1)как Ð±Ñ Ð³Ð¾Ð²Ð¾ÑÐ¸Ñ Ð¸Ð½ÑеÑпÑеÑаÑоÑÑ "Ñоздай ÑÑнкÑÐ¸Ñ Ð¸ помеÑÑи ÐµÑ Ð² пеÑеменнÑÑsayHi - Ð ÑÑÑоке
(2)Ð¼Ñ ÐºÐ¾Ð¿Ð¸ÑÑем ÑÑнкÑÐ¸Ñ Ð² новÑÑ Ð¿ÐµÑеменнÑÑfunc. ÐÑÑ Ñаз обÑаÑиÑе внимание: поÑлеsayHiÐ½ÐµÑ Ñкобок. ÐÑли Ð±Ñ Ð¾Ð½Ð¸ бÑли, Ñо вÑзовvar func = sayHi()запиÑал Ð±Ñ Ð²funcÑезÑлÑÑÐ°Ñ ÑабоÑÑsayHi()(кÑÑаÑи, ÑÐµÐ¼Ñ Ð¾Ð½ Ñавен? пÑавилÑно,undefined, Ð²ÐµÐ´Ñ Ð²Ð½ÑÑÑиsayHiнеÑreturn). - Ðа моменÑ
(3)ÑÑнкÑÐ¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ вÑзÑваÑÑ Ð¸ какsayHi()и какfunc() - â¦Ðднако, в лÑбой Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð·Ð½Ð°Ñение пеÑеменной можно поменÑÑÑ. ÐÑи ÑÑом, еÑли оно не ÑÑнкÑиÑ, Ñо вÑзов
(4)вÑдаÑÑ Ð¾ÑибкÑ.
ÐбÑÑнÑе знаÑениÑ, Ñакие как ÑиÑла или ÑÑÑоки, пÑедÑÑавлÑÑÑ Ñобой даннÑе. Ð ÑÑнкÑÐ¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ воÑпÑинимаÑÑ ÐºÐ°Ðº дейÑÑвие.
ÐÑо дейÑÑвие можно запÑÑÑиÑÑ ÑеÑез Ñкобки (), а можно и ÑкопиÑоваÑÑ Ð² дÑÑгÑÑ Ð¿ÐµÑеменнÑÑ, как бÑло пÑодемонÑÑÑиÑовано вÑÑе.
ÐбÑÑвление Function Expression
СÑÑеÑÑвÑÐµÑ Ð°Ð»ÑÑеÑнаÑивнÑй ÑинÑакÑÐ¸Ñ Ð´Ð»Ñ Ð¾Ð±ÑÑÐ²Ð»ÐµÐ½Ð¸Ñ ÑÑнкÑии, коÑоÑÑй еÑÑ Ð±Ð¾Ð»ÐµÐµ наглÑдно показÑваеÑ, ÑÑо ÑÑнкÑÐ¸Ñ â ÑÑо вÑего лиÑÑ ÑазновидноÑÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿ÐµÑеменной.
Ðн назÑваеÑÑÑ Â«Function Expression» (ÑÑнкÑионалÑное вÑÑажение) и вÑглÑÐ´Ð¸Ñ Ñак:
var f = function(паÑамеÑÑÑ) {
// Ñело ÑÑнкÑии
};
ÐапÑимеÑ:
var sayHi = function(person) {
alert( "ÐÑивеÑ, " + person );
};
sayHi('ÐаÑÑ');
СÑавнение Ñ Function Declaration
«ÐлаÑÑиÑеÑкое» обÑÑвление ÑÑнкÑии, о коÑоÑом Ð¼Ñ Ð³Ð¾Ð²Ð¾Ñили до ÑÑого, вида function имÑ(паÑамеÑÑÑ) {...}, назÑваеÑÑÑ Ð² ÑпеÑиÑикаÑии ÑзÑка «Function Declaration».
- Function Declaration â ÑÑнкÑиÑ, обÑÑÐ²Ð»ÐµÐ½Ð½Ð°Ñ Ð² оÑновном поÑоке кода.
- Function Expression â обÑÑвление ÑÑнкÑии в конÑекÑÑе какого-либо вÑÑажениÑ, напÑÐ¸Ð¼ÐµÑ Ð¿ÑиÑваиваниÑ.
ÐеÑмоÑÑÑ Ð½Ð° немного ÑазнÑй вид, по ÑÑÑи две ÑÑи запиÑи делаÑÑ Ð¾Ð´Ð½Ð¾ и Ñо же:
// Function Declaration
function sum(a, b) {
return a + b;
}
// Function Expression
var sum = function(a, b) {
return a + b;
}
Ðба ÑÑиÑ
обÑÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð³Ð¾Ð²Ð¾ÑÑÑ Ð¸Ð½ÑеÑпÑеÑаÑоÑÑ: «обÑÑви пеÑеменнÑÑ sum, Ñоздай ÑÑнкÑÐ¸Ñ Ñ ÑказаннÑми паÑамеÑÑами и кодом и ÑоÑ
Ñани ÐµÑ Ð² sum».
ÐÑновное оÑлиÑие Ð¼ÐµÐ¶Ð´Ñ Ð½Ð¸Ð¼Ð¸: ÑÑнкÑии, обÑÑвленнÑе как Function Declaration, ÑоздаÑÑÑÑ Ð¸Ð½ÑеÑпÑеÑаÑоÑом до вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð´Ð°.
ÐоÑÑÐ¾Ð¼Ñ Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ вÑзваÑÑ Ð´Ð¾ обÑÑвлениÑ, напÑимеÑ:
sayHi("ÐаÑÑ"); // ÐÑивеÑ, ÐаÑÑ
function sayHi(name) {
alert( "ÐÑивеÑ, " + name );
}
РеÑли Ð±Ñ ÑÑо бÑло обÑÑвление Function Expression, Ñо Ñакой вÑзов Ð±Ñ Ð½Ðµ ÑÑабоÑал:
sayHi("ÐаÑÑ"); // оÑибка!
var sayHi = function(name) {
alert( "ÐÑивеÑ, " + name );
}
ÐÑо из-за Ñого, ÑÑо JavaScript пеÑед запÑÑком кода иÑÐµÑ Ð² нÑм Function Declaration (иÑ
легко найÑи: они не ÑвлÑÑÑÑÑ ÑаÑÑÑÑ Ð²ÑÑажений и наÑинаÑÑÑÑ Ñо Ñлова function) и обÑабаÑÑÐ²Ð°ÐµÑ Ð¸Ñ
.
Ð Function Expression ÑоздаÑÑÑÑ Ð² пÑоÑеÑÑе вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð²ÑÑажениÑ, в коÑоÑом ÑозданÑ, в данном ÑлÑÑае â ÑÑнкÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ñоздана пÑи опеÑаÑии пÑиÑÐ²Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ sayHi = function...
Ðак пÑавило, возможноÑÑÑ Function Declaration вÑзваÑÑ ÑÑнкÑÐ¸Ñ Ð´Ð¾ обÑÑÐ²Ð»ÐµÐ½Ð¸Ñ â ÑÑо Ñдобно, Ñак как даÑÑ Ð±Ð¾Ð»ÑÑе ÑÐ²Ð¾Ð±Ð¾Ð´Ñ Ð² Ñом, как оÑганизоваÑÑ Ñвой код.
Ðожно ÑаÑположиÑÑ ÑÑнкÑии внизÑ, а Ð¸Ñ Ð²Ñзов â ÑвеÑÑ Ñ Ð¸Ð»Ð¸ наобоÑоÑ.
УÑловное обÑÑвление ÑÑнкÑии
РнекоÑоÑÑÑ ÑлÑÑаÑÑ Â«Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑное ÑдобÑÑво» 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.
new Function
СÑÑеÑÑвÑÐµÑ ÐµÑÑ Ð¾Ð´Ð¸Ð½ ÑпоÑоб ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑÑнкÑии, коÑоÑÑй иÑполÑзÑеÑÑÑ Ð¾ÑÐµÐ½Ñ Ñедко, но ÑпомÑнем и его Ð´Ð»Ñ Ð¿Ð¾Ð»Ð½Ð¾ÑÑ ÐºÐ°ÑÑинÑ.
Ðн позволÑÐµÑ ÑоздаваÑÑ ÑÑнкÑÐ¸Ñ Ð¿Ð¾Ð»Ð½Ð¾ÑÑÑÑ Â«Ð½Ð° леÑÑ» из ÑÑÑоки, Ð²Ð¾Ñ Ñак:
var sum = new Function('a,b', ' return a+b; ');
var result = sum(1, 2);
alert( result ); // 3
То еÑÑÑ, ÑÑнкÑÐ¸Ñ ÑоздаÑÑÑÑ Ð²Ñзовом new Function(params, code):
params- ÐаÑамеÑÑÑ ÑÑнкÑии ÑеÑез запÑÑÑÑ Ð² виде ÑÑÑоки.
code- Ðод ÑÑнкÑии в виде ÑÑÑоки.
Таким обÑазом можно конÑÑÑÑиÑоваÑÑ ÑÑнкÑиÑ, код коÑоÑой неизвеÑÑен на Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½Ð°Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ Ð¿ÑогÑаммÑ, но ÑÑÑока Ñ Ð½Ð¸Ð¼ генеÑиÑÑеÑÑÑ Ð¸Ð»Ð¸ подгÑÑжаеÑÑÑ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑки во вÑÐµÐ¼Ñ ÐµÑ Ð²ÑполнениÑ.
ÐÑÐ¸Ð¼ÐµÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ â динамиÑеÑÐºÐ°Ñ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑÑÐ¸Ñ Ñаблонов на JavaScript, Ð¼Ñ Ð²ÑÑÑеÑимÑÑ Ñ Ð½ÐµÐ¹ позже, пÑи ÑабоÑе Ñ Ð¸Ð½ÑеÑÑейÑами.
ÐÑого
ФÑнкÑии в JavaScript ÑвлÑÑÑÑÑ Ð·Ð½Ð°ÑениÑми. ÐÑ Ð¼Ð¾Ð¶Ð½Ð¾ пÑиÑваиваÑÑ, пеÑедаваÑÑ, ÑоздаваÑÑ Ð² лÑбом меÑÑе кода.
- ÐÑли ÑÑнкÑÐ¸Ñ Ð¾Ð±ÑÑвлена в оÑновном поÑоке кода, Ñо ÑÑо Function Declaration.
- ÐÑли ÑÑнкÑÐ¸Ñ Ñоздана как ÑаÑÑÑ Ð²ÑÑажениÑ, Ñо ÑÑо Function Expression.
ÐÐµÐ¶Ð´Ñ ÑÑими двÑÐ¼Ñ Ð¾ÑновнÑми ÑпоÑобами ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑÑнкÑий еÑÑÑ ÑледÑÑÑие ÑазлиÑиÑ:
| Function Declaration | Function Expression | |
|---|---|---|
| ÐÑÐµÐ¼Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ | Ðо вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿ÐµÑвой ÑÑÑоÑки кода. | Ðогда ÑпÑавление доÑÑÐ¸Ð³Ð°ÐµÑ ÑÑÑоки Ñ ÑÑнкÑией. |
| Ðожно вÑзваÑÑ Ð´Ð¾ обÑÑÐ²Ð»ÐµÐ½Ð¸Ñ | Ðа (Ñ.к. ÑоздаÑÑÑÑ Ð·Ð°Ñанее) |
ÐÐµÑ |
УÑловное обÑÑвление в if |
Ðе ÑабоÑÐ°ÐµÑ |
РабоÑÐ°ÐµÑ |
Ðногда в коде наÑинаÑÑиÑ
ÑазÑабоÑÑиков можно ÑвидеÑÑ Ð¼Ð½Ð¾Ð³Ð¾ Function Expression. ÐоÑемÑ-Ñо, видимо, не оÑÐµÐ½Ñ Ð¿Ð¾Ð½Ð¸Ð¼Ð°Ñ Ð¿ÑоиÑÑ
одÑÑее, ÑÑнкÑии ÑеÑаÑÑ ÑоздаваÑÑ ÐºÐ°Ðº var func = function(), но в болÑÑинÑÑве ÑлÑÑаев обÑÑное обÑÑвление ÑÑнкÑии â лÑÑÑе.
ÐÑли Ð½ÐµÑ Ñвной пÑиÑÐ¸Ð½Ñ Ð¸ÑполÑзоваÑÑ Function Expression â пÑедпоÑиÑайÑе Function Declaration.
СÑавниÑе по ÑиÑаемоÑÑи:
// Function Expression
var f = function() { ... }
// Function Declaration
function f() { ... }
Function Declaration коÑоÑе и лÑÑÑе ÑиÑаеÑÑÑ. ÐополниÑелÑнÑй бонÑÑ â Ñакие ÑÑнкÑии можно вÑзÑваÑÑ Ð´Ð¾ Ñого, как они обÑÑвленÑ.
ÐÑполÑзÑйÑе Function Expression ÑолÑко Ñам, где ÑÑо дейÑÑвиÑелÑно нÑжно и Ñдобно.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)