Baseline Widely available *
СводкаРобÑем ÑлÑÑае, ÑÑнкÑÐ¸Ñ â ÑÑо "подпÑогÑамма", коÑоÑÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ вÑзÑваÑÑ Ð¸Ð· внеÑнего (или внÑÑÑеннего, в ÑлÑÑае ÑекÑÑÑии) по оÑноÑÐµÐ½Ð¸Ñ Ðº ÑÑнкÑии кода. Ðак и Ñама пÑогÑамма, ÑÑнкÑÐ¸Ñ ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· поÑледоваÑелÑноÑÑи инÑÑÑÑкÑий, назÑваемой Ñелом ÑÑнкÑии. ÐнаÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð¿ÐµÑÐµÐ´Ð°Ð½Ñ Ð² ÑÑнкÑиÑ, а ÑÑнкÑÐ¸Ñ Ð²ÐµÑнÑÑ Ð·Ð½Ð°Ñение.
Ð JavaScript ÑÑнкÑии ÑвлÑÑÑÑÑ Ð¾Ð±ÑекÑами пеÑвого клаÑÑа, Ñо еÑÑÑ: они ÑвлÑÑÑÑÑ Ð¾Ð±ÑекÑами и Ñ Ð½Ð¸Ð¼Ð¸ можно взаимодейÑÑвоваÑÑ Ð¸ пеÑедаваÑÑ Ð¸Ñ
ÑоÑно Ñак же как лÑбой дÑÑгой обÑекÑ. ÐÑли бÑÑÑ ÑоÑнÑм, ÑÑнкÑии â ÑÑо обÑекÑÑ Function
.
ÐолÑÑе подÑобноÑÑей и пÑимеÑов можно найÑи в ÑÑководÑÑве по ÑÑнкÑиÑм в JavaScript.
ÐпиÑаниеÐÐ°Ð¶Ð´Ð°Ñ ÑÑнкÑÐ¸Ñ Ð² JavaScript â ÑÑо обÑÐµÐºÑ Function. Ð ÑвойÑÑваÑ
и меÑодаÑ
обÑекÑов Function можно пÑоÑиÑаÑÑ Ð² ÑÑаÑÑе Function
.
ФÑнкÑии â ÑÑо не пÑоÑедÑÑÑ. ФÑнкÑÐ¸Ñ Ð²Ñегда возвÑаÑÐ°ÐµÑ Ð·Ð½Ð°Ñение, а пÑоÑедÑÑа Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ, а Ð¼Ð¾Ð¶ÐµÑ Ð½Ðµ возвÑаÑаÑÑ.
ЧÑÐ¾Ð±Ñ Ð²ÐµÑнÑÑÑ Ð·Ð½Ð°Ñение, оÑлиÑное Ð¾Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ, в ÑÑнкÑии должна бÑÑÑ Ð¸Ð½ÑÑÑÑкÑÐ¸Ñ return
, коÑоÑÐ°Ñ ÑказÑваеÑ, ÑÑо именно нÑжно веÑнÑÑÑ. ФÑнкÑÐ¸Ñ Ð±ÐµÐ· него веÑнÑÑ Ð·Ð½Ð°Ñение по ÑмолÑаниÑ. Ð ÑлÑÑае конÑÑÑÑкÑоÑа, вÑзванного Ñ ÐºÐ»ÑÑевÑм Ñловом new
, знаÑение по ÑмолÑÐ°Ð½Ð¸Ñ â ÑÑо знаÑение его паÑамеÑÑа this
. ÐÐ»Ñ Ð¾ÑÑалÑнÑÑ
ÑÑнкÑий знаÑением по ÑмолÑÐ°Ð½Ð¸Ñ Ð±ÑÐ´ÐµÑ undefined
.
ÐаÑамеÑÑÑ Ð²Ñзова ÑÑнкÑии назÑваÑÑÑÑ Ð°ÑгÑменÑами ÑÑнкÑии. ÐÑгÑменÑÑ Ð¿ÐµÑедаÑÑÑÑ Ð² ÑÑнкÑÐ¸Ñ Ð¿Ð¾ знаÑениÑ. ÐÑли ÑÑнкÑÐ¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÐµÑ Ð·Ð½Ð°Ñение аÑгÑменÑа, ÑÑо изменение не оÑÑажаеÑÑÑ Ð½Ð° глобалÑном ÑоÑÑоÑнии или вÑзÑваÑÑей ÑÑнкÑии. Ðднако ÑÑÑлки на обÑекÑÑ â ÑÑо Ñоже знаÑениÑ, и они оÑлиÑаÑÑÑÑ Ñем, ÑÑо еÑли ÑÑнкÑÐ¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÐµÑ ÑвойÑÑва обÑекÑа по ÑÑÑлке, ÑÑо изменение видно ÑнаÑÑжи ÑÑнкÑии, как показано в пÑимеÑе ниже.
/* ÐбÑÑвлÑем ÑÑнкÑÐ¸Ñ 'myFunc' */
function myFunc(theObject) {
theObject.brand = "Toyota";
}
/*
* ÐбÑÑвлÑем пеÑеменнÑÑ 'mycar';
* ÑоздаÑм и иниÑиализиÑÑем новÑй Object;
* пÑиÑавниваем 'mycar' к ÑÑÑлке на него
*/
var mycar = {
brand: "Honda",
model: "Accord",
year: 1998,
};
/* ÐÑÐ²ÐµÐ´ÐµÑ 'Honda' */
console.log(mycar.brand);
/* ÐеÑедаÑм ÑÑÑÐ»ÐºÑ Ð½Ð° обÑÐµÐºÑ Ð² ÑÑнкÑÐ¸Ñ */
myFunc(mycar);
/*
* ÐÑÐ²ÐµÐ´ÐµÑ 'Toyota', Ñак как знаÑение ÑвойÑÑва 'brand'
* бÑло изменено внÑÑÑи ÑÑнкÑии.
*/
console.log(mycar.brand);
ÐлÑÑевое Ñлово this
не ÑÑÑлаеÑÑÑ Ð½Ð° ÑÑнкÑиÑ, коÑоÑÐ°Ñ Ð²ÑполнÑеÑÑÑ Ð² даннÑй моменÑ, поÑÑÐ¾Ð¼Ñ Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¾Ð±ÑаÑаÑÑÑÑ Ðº обÑекÑами Function по имени, даже внÑÑÑи Ñела Ñамой ÑÑнкÑии.
ÐÑÑÑ Ð½ÐµÑколÑко ÑпоÑобов опÑеделиÑÑ ÑÑнкÑиÑ:
ÐбÑÑвление ÑÑнкÑии (инÑÑÑÑкÑиÑfunction
)
СпеÑиалÑнÑй ÑинÑакÑÐ¸Ñ Ð´Ð»Ñ Ð¾Ð±ÑÑÐ²Ð»ÐµÐ½Ð¸Ñ ÑÑнкÑий (более подÑобно: function statement):
function name([param[, param[, ... param]]]) { statements }
name
ÐÐ¼Ñ ÑÑнкÑии.
param
ÐÐ¼Ñ Ð°ÑгÑменÑа, пеÑедаваемого в ÑÑнкÑиÑ. У ÑÑнкÑии Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½Ðµ более 255 аÑгÑменÑов.
statements
ÐнÑÑÑÑкÑии, из коÑоÑÑÑ ÑоÑÑÐ¾Ð¸Ñ Ñело ÑÑнкÑии.
function
)
ФÑнкÑиÑ-вÑÑажение Ð¿Ð¾Ñ Ð¾Ð¶Ð° на опÑеделение ÑÑнкÑии и Ð¸Ð¼ÐµÐµÑ Ñакой же ÑинÑакÑÐ¸Ñ (более подÑобно: function operator):
function [name]([param] [, param] [..., param]) { statements }
name
ÐÐ¼Ñ ÑÑнкÑии. ÐÐ¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½Ðµ Ñказано, в Ñаком ÑлÑÑае ÑÑнкÑÐ¸Ñ ÑÑановиÑÑÑ Ð°Ð½Ð¾Ð½Ð¸Ð¼Ð½Ð¾Ð¹.
param
ÐÐ¼Ñ Ð°ÑгÑменÑа, пеÑедаваемого в ÑÑнкÑиÑ. У ÑÑнкÑии Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½Ðµ более 255 аÑгÑменÑов.
statements
ÐнÑÑÑÑкÑии, из коÑоÑÑÑ ÑоÑÑÐ¾Ð¸Ñ Ñело ÑÑнкÑии.
ÐÑимеÑание: СÑÑелоÑнÑе ÑÑнкÑии ÑвлÑÑÑÑÑ ÑкÑпеÑименÑалÑной ÑÐµÑ Ð½Ð¾Ð»Ð¾Ð³Ð¸ÐµÐ¹*,* ÑаÑÑÑÑ ÑпеÑиÑикаÑии ECMAScript 6 и пока ÑÑо не поддеÑживаÑÑÑÑ Ð²Ñеми бÑаÑзеÑами.
СÑÑелоÑнÑе ÑÑнкÑии оÑлиÑаÑÑÑÑ Ð±Ð¾Ð»ÐµÐµ кÑаÑким ÑинÑакÑиÑом и Ñем, ÑÑо они лекÑиÑеÑки ÑвÑзÑваÑÑ Ð·Ð½Ð°Ñение Ñвоего this (подÑобнее об ÑÑом в ÑÑаÑÑе СÑÑелоÑнÑе ÑÑнкÑии):
([param] [, param]) => { statements } param => expression
param
ÐÐ¼Ñ Ð¿Ð°ÑамеÑÑа. ÐÑли паÑамеÑÑов неÑ, вмеÑÑо Ð½Ð¸Ñ Ð½Ñжно поÑÑавиÑÑ (). ÐÑли паÑамеÑÑов болÑÑе одного, Ð¸Ñ Ñакже нÑжно заклÑÑиÑÑ Ð² ().
statements or expression
ÐÑли инÑÑÑÑкÑий неÑколÑко, Ð¸Ñ Ð½Ñжно заклÑÑиÑÑ Ð² {}. ÐÐ»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑигÑÑнÑÑ Ñкобок не ÑÑебÑеÑÑÑ, а ÑезÑлÑÑÐ°Ñ ÑÑого вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð±ÑÐ´ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑÑн ÑÑнкÑией (Ñо еÑÑÑ` ÑÑнкÑÐ¸Ñ x => 3 + 8 веÑнÑÑ 11).```
Function
ÐÑимеÑание: ÐÑполÑзоваÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑÐ¾Ñ Function не ÑекомендÑеÑÑÑ, Ñак как он пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ñело ÑÑнкÑии в виде ÑÑÑоки, а ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð¼ÐµÑаÑÑ Ð¾Ð¿ÑимизаÑиÑм, коÑоÑÑе вÑполнÑÑÑ Ð´Ð²Ð¸Ð¶ÐºÐ¸ JavaScript, а Ñакже пÑивеÑÑи к дÑÑгим пÑоблемам.
ÐбÑекÑÑ Function
можно ÑоздаваÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¾Ð¿ÐµÑаÑоÑа new
(как и лÑбÑе дÑÑгие обÑекÑÑ):
new Function (arg1, arg2, ... argN, functionBody)
arg1, arg2, ... argN
ÐÐ¾Ð»Ñ Ð¸Ð»Ð¸ болÑÑе имÑн паÑамеÑÑов ÑÑнкÑии. ÐÐ¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ бÑÑÑ ÑÑÑокой, ÑодеÑжаÑей валиднÑй иденÑиÑикаÑÐ¾Ñ JavaScript. ÐÑли паÑамеÑÑов неÑколÑко, они Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ ÑÐ°Ð·Ð´ÐµÐ»ÐµÐ½Ñ Ð·Ð°Ð¿ÑÑÑми. ÐапÑимеÑ: "x
", "theValue
", или "a,b
".
functionBody
ÐнÑÑÑÑкÑии, из коÑоÑÑÑ ÑоÑÑÐ¾Ð¸Ñ Ñело ÑÑнкÑии.
ÐонÑÑÑÑкÑÐ¾Ñ Function
можно вÑзÑваÑÑ Ð¸ без опеÑаÑоÑа new,
ÑÑÑÐµÐºÑ Ð±ÑÐ´ÐµÑ Ñем же.
ÐÑимеÑание: ÐÑÑаÑоÑнÑе паÑамеÑÑÑ Ð¸ паÑамеÑÑÑ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ â ÑÑо ÑкÑпеÑименÑалÑÐ½Ð°Ñ ÑÐµÑ Ð½Ð¾Ð»Ð¾Ð³Ð¸Ñ, ÑаÑÑÑ ÑпеÑиÑикаÑии ECMAScript 6, и они пока еÑÑ Ð½Ðµ полÑÑили ÑиÑокой поддеÑжки ÑÑеди бÑаÑзеÑов.
ÐаÑамеÑÑÑ Ð¿Ð¾ ÑмолÑаниÑÐаÑамеÑÑÑ ÑÑнкÑии по ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÑÑ Ð¸Ð½Ð¸ÑиализиÑоваÑÑ ÑоÑмалÑнÑе паÑамеÑÑÑ Ñо знаÑениÑми по ÑмолÑаниÑ, еÑли им не бÑло пеÑедано знаÑение, или бÑло пеÑедано undefined
. ÐодÑобнее о ниÑ
можно ÑзнаÑÑ Ð² ÑÑаÑÑе ÐаÑамеÑÑÑ Ð¿Ð¾ ÑмолÑаниÑ.
СинÑакÑÐ¸Ñ Ð¾ÑÑавÑÐ¸Ñ ÑÑ Ð¿Ð°ÑамеÑÑов позволÑÐµÑ Ð¿ÐµÑедаÑÑ Ð±ÐµÑконеÑное ÑиÑло аÑгÑменÑов как маÑÑив. ÐодÑобноÑÑи можно найÑи в ÑÑаÑÑе ÐÑÑаÑоÑнÑе паÑамеÑÑÑ.
ÐбÑекÑarguments
ÐнÑÑÑи ÑÑнкÑии полÑÑиÑÑ Ð´Ð¾ÑÑÑп к ÐµÑ Ð°ÑгÑменÑам можно ÑеÑез обÑÐµÐºÑ arguments.
arguments
: ÐбÑекÑ, поÑ
ожий на маÑÑив и ÑодеÑжаÑий вÑе аÑгÑменÑÑ, пеÑеданнÑе в ÑекÑÑÑÑ ÑÑнкÑиÑ.arguments.callee
УÑÑаÑело : ФÑнкÑиÑ, иÑполнÑÐµÐ¼Ð°Ñ Ð² ÑекÑÑий моменÑ.arguments.caller
: ФÑнкÑиÑ, коÑоÑÐ°Ñ Ð²Ñзвала ÑекÑÑÑÑ ÑÑнкÑиÑ.arguments.length
: ЧиÑло аÑгÑменÑов, пеÑеданнÑÑ
в ÑÑнкÑиÑ.Ðожно опÑеделÑÑÑ Ð³ÐµÑÑеÑÑ (меÑÐ¾Ð´Ñ Ð´Ð»Ñ ÑÑениÑ) и ÑеÑÑеÑÑ (меÑÐ¾Ð´Ñ Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ) Ð´Ð»Ñ Ð»Ñбого вÑÑÑоенного или полÑзоваÑелÑÑкого обÑекÑа, коÑоÑÑй поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ðµ новÑÑ ÑвойÑÑв. ÐÐ»Ñ ÑÑого иÑполÑзÑеÑÑÑ ÑинÑакÑÐ¸Ñ Ð»Ð¸ÑеÑала обÑекÑа.
СвÑзÑÐ²Ð°ÐµÑ ÑвойÑÑво обÑекÑа Ñ ÑÑнкÑией, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð²Ñзвана пÑи обÑаÑении к ÑвойÑÑвÑ.
СвÑзÑÐ²Ð°ÐµÑ ÑвойÑÑво обÑекÑа Ñ ÑÑнкÑией, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð²Ñзвана пÑи попÑÑке Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑвойÑÑва.
ÐÑимеÑание: ÐпÑеделение меÑодов â ÑÑо ÑкÑпеÑименÑалÑÐ½Ð°Ñ ÑÐµÑ Ð½Ð¾Ð»Ð¾Ð³Ð¸Ñ, ÑаÑÑÑ ÑпеÑиÑикаÑии ECMAScript 6, и она пока еÑÑ Ð½Ðµ полÑÑила ÑиÑокой поддеÑжки ÑÑеди бÑаÑзеÑов.
ÐаÑÐ¸Ð½Ð°Ñ Ñ ECMAScript 6, можно опÑеделÑÑÑ ÑобÑÑвеннÑе меÑодÑ, иÑполÑзÑÑÑ Ð±Ð¾Ð»ÐµÐµ кÑаÑкий ÑинÑакÑиÑ, Ð¿Ð¾Ñ Ð¾Ð¶Ð¸Ð¹ на геÑÑеÑÑ Ð¸ ÑеÑÑеÑÑ. Ðолее подÑобно â в ÑÑаÑÑе ÐпÑеделение меÑодов.
var obj = {
foo() {},
bar() {},
};
СÑавнение конÑÑÑÑкÑоÑов Function
Ñ Ð¾Ð±ÑÑвлением ÑÑнкÑий и ÑÑнкÑиÑми-вÑÑажениÑми
ÐоÑмоÑÑиÑе на ÑледÑÑÑие пÑимеÑÑ:
ФÑнкÑиÑ, опÑеделÑÐ½Ð½Ð°Ñ ÑеÑез конÑÑÑÑкÑÐ¾Ñ Function
и пÑиÑÐ°Ð²Ð½ÐµÐ½Ð½Ð°Ñ Ðº пеÑеменной multiply:
var multiply = new Function("x", "y", "return x * y");
ÐбÑÑвление ÑÑнкÑии multiply:
function multiply(x, y) {
return x * y;
}
ÐÐ½Ð¾Ð½Ð¸Ð¼Ð½Ð°Ñ ÑÑнкÑиÑ-вÑÑажение, пÑиÑÐ°Ð²Ð½ÐµÐ½Ð½Ð°Ñ Ðº пеÑеменной multiply:
var multiply = function (x, y) {
return x * y;
};
ФÑнкÑиÑ-вÑÑажение Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ func_name
, пÑиÑавненное к пеÑеменной multiply:
var multiply = function func_name(x, y) {
return x * y;
};
ÐÑлиÑиÑ
Ðо вÑÐµÑ ÑлÑÑаÑÑ ÑезÑлÑÑÐ°Ñ Ð¿ÑимеÑно одинаков, но еÑÑÑ Ð½ÐµÑколÑко нÑанÑов:
ÐÐ¼Ñ ÑÑнкÑии и пеÑеменнаÑ, к коÑоÑой ÑÑнкÑÐ¸Ñ Ð¿ÑиÑавнена â ÑÑо не одно и Ñо же. ÐÐ¼Ñ ÑÑнкÑии нелÑÐ·Ñ Ð¼ÐµÐ½ÑÑÑ, а Ð²Ð¾Ñ Ð¿ÐµÑеменной, к коÑоÑой пÑиÑавнена ÑÑнкÑиÑ, можно даÑÑ Ð´ÑÑгое знаÑение. Ð ÑлÑÑае ÑÑнкÑии-вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼, ÑÑо Ð¸Ð¼Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸ÑполÑзовано ÑолÑко внÑÑÑи Ñамой ÑÑнкÑии. ÐÑи попÑÑке иÑполÑзоваÑÑ ÐµÐ³Ð¾ ÑнаÑÑжи Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½ÐµÑ Ð¾Ñибка (а еÑли Ñанее бÑла обÑÑвлена пеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ñ Ñаким именем, бÑÐ´ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑено undefined
). ÐапÑимеÑ:
var y = function x() {};
alert(x); // вÑÐºÐ¸Ð½ÐµÑ Ð¾ÑибкÑ
Также Ð¸Ð¼Ñ ÑÑнкÑии-вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿ÑоÑвлÑеÑÑÑ, еÑли ÑеÑиализоваÑÑ ÑÑнкÑÐ¸Ñ ÑеÑез меÑод Function.toString.
Ð Ð²Ð¾Ñ Ð¿ÐµÑеменнаÑ, к коÑоÑой ÑÑнкÑÐ¸Ñ Ð¿ÑиÑавнена, огÑаниÑена ÑолÑко ÑобÑÑвенной облаÑÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑи, коÑоÑÐ°Ñ Ð²ÐºÐ»ÑÑÐ°ÐµÑ ÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ, где ÑÑнкÑÐ¸Ñ Ð±Ñла обÑÑвлена.
Ðак показано в ÑеÑвÑÑÑом пÑимеÑе, Ð¸Ð¼Ñ ÑÑнкÑии Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑлиÑаÑÑÑÑ Ð¾Ñ Ð¸Ð¼ÐµÐ½Ð¸ пеÑеменной, к коÑоÑой ÑÑнкÑÐ¸Ñ Ð¿ÑиÑавнена, ÑÑи имена никак не ÑвÑзанÑ. ÐбÑÑвление ÑÑнкÑии (function declaration) Ñакже ÑоздаÑÑ Ð¸ пеÑеменнÑÑ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼, аналогиÑнÑм имени ÑÑнкÑии. Таким обÑазом:
У ÑÑнкÑии, опÑеделÑнной Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ 'new Function'
, Ð½ÐµÑ Ð¸Ð¼ÐµÐ½Ð¸. Ðднако, в JavaScript движке SpiderMonkey, ÑеÑиализованное пÑедÑÑавление ÑÑнкÑии оÑобÑажаеÑÑÑ Ñак, как бÑдÑо оно Ð¸Ð¼ÐµÐµÑ Ð¸Ð¼Ñ "anonymous". ÐапÑимеÑ, , alert(new Function())
вÑдаÑÑ:
Так как на Ñамом деле Ñ ÑÑнкÑии Ð½ÐµÑ Ð¸Ð¼ÐµÐ½Ð¸, пеÑеменнÑÑ anonymous
нелÑÐ·Ñ Ð¸ÑполÑзоваÑÑ Ð²Ð½ÑÑÑи ÑÑнкÑии. ÐапÑимеÑ, ÑледÑÑÑий пÑÐ¸Ð¼ÐµÑ Ð²ÑÐºÐ¸Ð½ÐµÑ Ð¾ÑибкÑ:
var foo = new Function("alert(anonymous);");
foo();
РоÑлиÑии Ð¾Ñ ÑÑнкÑий, опÑеделÑннÑÑ
ÑеÑез ÑÑнкÑиÑ-вÑÑажение или конÑÑÑÑкÑÐ¾Ñ Function
, ÑÑнкÑиÑ, опÑеделÑÐ½Ð½Ð°Ñ ÑеÑез обÑÑвление, Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸ÑполÑзована пеÑед Ñем, как бÑла опÑеделена. ÐапÑимеÑ:
foo(); // вÑÐ²ÐµÐ´ÐµÑ FOO!
function foo() {
alert("FOO!");
}
ФÑнкÑиÑ, опÑеделÑÐ½Ð½Ð°Ñ ÑеÑез ÑÑнкÑиÑ-вÑÑажение, наÑледÑÐµÑ ÑекÑÑÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑи, Ñо еÑÑÑ ÑоздаÑÑ Ð·Ð°Ð¼Ñкание. Ð Ð²Ð¾Ñ ÑÑнкÑиÑ, ÑÐ¾Ð·Ð´Ð°Ð½Ð½Ð°Ñ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑоÑа Function
, не наÑледÑÐµÑ Ð½Ð¸Ñего, кÑоме глобалÑной облаÑÑи видимоÑÑи (ÐµÑ Ð½Ð°ÑледÑÑÑ Ð²Ð¾Ð¾Ð±Ñе вÑе ÑÑнкÑии).
ФÑнкÑии, опÑеделÑннÑе ÑеÑез ÑÑнкÑиÑ-вÑÑажение и обÑÑвление ÑÑнкÑии паÑÑÑÑÑÑ ÑолÑко один Ñаз, в оÑлиÑии Ð¾Ñ ÑÑнкÑий, ÑозданнÑÑ
Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑоÑа. То еÑÑÑ ÑÑÑока, коÑоÑÐ°Ñ Ð¿ÐµÑедаÑÑÑÑ Ð² конÑÑÑÑкÑÐ¾Ñ Function
, паÑÑиÑÑÑ Ð¿Ñи каждом вÑзове конÑÑÑÑкÑоÑа. Ð Ñ
оÑÑ ÑÑнкÑиÑ-вÑÑажение каждÑй Ñаз ÑоздаÑÑ Ð·Ð°Ð¼Ñкание, Ñело ÑÑнкÑии пÑи ÑÑом не паÑÑиÑÑÑ, и полÑÑаеÑÑÑ, ÑÑо ÑÑнкÑии-вÑÑажение вÑÑ Ñавно бÑÑÑÑее, Ñем "new Function(...)
". ÐоÑÑÐ¾Ð¼Ñ ÐºÐ¾Ð½ÑÑÑÑкÑоÑа Function
в болÑÑинÑÑве ÑлÑÑаев ÑÑÐ¾Ð¸Ñ Ð¸Ð·Ð±ÐµÐ³Ð°ÑÑ, еÑли ÑÑо возможно.
СÑÐ¾Ð¸Ñ Ð¾ÑмеÑиÑÑ, ÑÑо ÑÑнкÑии-вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¸ обÑÑÐ²Ð»ÐµÐ½Ð¸Ñ ÑÑнкÑий внÑÑÑи ÑÑнкÑии, Ñозданной пÑи паÑÑинге конÑÑÑÑкÑоÑа Function
, паÑÑÑÑÑÑ ÑолÑко один Ñаз. ÐапÑимеÑ:
var foo = new Function(
"var bar = 'FOO!';\nreturn(function() {\n\talert(bar);\n});",
)();
foo(); // "function() {\n\talert(bar);\n}" ÐÑа ÑаÑÑÑ ÑÑÑоки, ÑоÑÑавлÑÑÑей Ñело ÑÑнкÑии, не паÑÑиÑÑÑ Ð²Ð¾ вÑоÑой Ñаз.
ÐбÑÑвление ÑÑнкÑии можно оÑÐµÐ½Ñ Ð»ÐµÐ³ÐºÐ¾ (и ÑаÑÑо ÑлÑÑайно) пÑевÑаÑиÑÑ Ð² ÑÑнкÑиÑ-вÑÑажение. ÐбÑÑвление ÑÑнкÑии пеÑеÑÑаÑÑ Ð±ÑÑÑ ÑаковÑм, еÑли оно:
var x = 0; // иÑÑ
однÑй ÑлеменÑ
if (x == 0) {
// иÑÑ
однÑй ÑлеменÑ
x = 10; // не иÑÑ
однÑй ÑлеменÑ
function boo() {} // не иÑÑ
однÑй ÑлеменÑ
}
function foo() {
// иÑÑ
однÑй ÑлеменÑ
var y = 20; // иÑÑ
однÑй ÑлеменÑ
function bar() {} // иÑÑ
однÑй ÑлеменÑ
while (y == 10) {
// иÑÑ
однÑй ÑлеменÑ
function blah() {} // не иÑÑ
однÑй ÑлеменÑ
y++; // не иÑÑ
однÑй ÑлеменÑ
}
}
ÐÑимеÑÑ
// обÑÑвление ÑÑнкÑии
function foo() {}
// ÑÑнкÑиÑ-вÑÑажение
(function bar() {});
// ÑÑнкÑиÑ-вÑÑажение
x = function hello() {};
if (x) {
// ÑÑнкÑиÑ-вÑÑажение
function world() {}
}
// обÑÑвление ÑÑнкÑии
function a() {
// обÑÑвление ÑÑнкÑии
function b() {}
if (0) {
// ÑÑнкÑиÑ-вÑÑажение
function c() {}
}
}
ÐпÑеделение ÑÑнкÑии в завиÑимоÑÑи Ð¾Ñ ÑÑловиÑ
ФÑнкÑии могÑÑ Ð±ÑÑÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð² завиÑимоÑÑи Ð¾Ñ ÑÑловий Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¸Ð½ÑÑÑÑкÑии function (ÑазÑеÑÑнное ÑаÑÑиÑение ÑÑандаÑÑа
ECMA-262 Edition 3) или конÑÑÑÑкÑоÑа Function
. ÐбÑаÑиÑе внимание, ÑÑо подобнÑе инÑÑÑÑкÑии запÑеÑÐµÐ½Ñ Ð² ES5 strict. ÐÑоме Ñого, ÑÑа возможноÑÑÑ Ð¿Ð¾-ÑÐ°Ð·Ð½Ð¾Ð¼Ñ Ð²ÐµÐ´ÑÑ ÑÐµÐ±Ñ Ð² ÑазнÑÑ
бÑаÑзеÑаÑ
, поÑÑÐ¾Ð¼Ñ Ð½Ðµ ÑÑÐ¾Ð¸Ñ Ð½Ð° Ð½ÐµÑ ÑаÑÑÑиÑÑваÑÑ.
Ркоде ниже ÑÑнкÑÐ¸Ñ zero
никогда не бÑÐ´ÐµÑ Ð¾Ð¿Ñеделена и не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²Ñзвана, поÑÐ¾Ð¼Ñ ÑÑо 'if (0)
' вÑегда ÑаÑÑениваеÑÑÑ ÐºÐ°Ðº false
:
if (0) {
function zero() {
document.writeln("This is zero.");
}
}
ÐÑли измениÑÑ ÑÑловие на 'if (1)
', ÑÑнкÑÐ¸Ñ zero
бÑÐ´ÐµÑ Ð¾Ð¿Ñеделена.
ÐамеÑÑÑе, ÑÑо Ñ Ð¾ÑÑ ÑÑо вÑглÑÐ´Ð¸Ñ ÐºÐ°Ðº обÑÑвление ÑÑнкÑии, на Ñамом деле, ÑÑо ÑÑнкÑиÑ-вÑÑажение (или инÑÑÑÑкÑиÑ), Ñак как она вложена внÑÑÑÑ Ð´ÑÑгой инÑÑÑÑкÑии. ÐзÑÑиÑе ÑазниÑÑ Ð¼ÐµÐ¶Ð´Ñ Ð¾Ð±ÑÑвлением ÑÑнкÑии и ÑÑнкÑией-вÑÑажением.
ÐекоÑоÑÑе JavaScript-движки (но не SpiderMonkey), невеÑно ÑÑиÑаÑÑ Ð»ÑбÑÑ ÑÑнкÑиÑ-вÑÑажение Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ за обÑÑвление ÑÑнкÑии. ÐÑо пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº ÑомÑ, ÑÑо ÑÑнкÑÐ¸Ñ zero
бÑÐ´ÐµÑ Ð¾Ð¿Ñеделена, даже еÑли ÑÑловие вÑегда false
. Ðолее безопаÑнÑй ÑпоÑоб опÑеделиÑÑ ÑÑнкÑÐ¸Ñ Ð¿Ð¾ ÑÑÐ»Ð¾Ð²Ð¸Ñ - ÑÑо ÑделаÑÑ ÐµÑ Ð°Ð½Ð¾Ð½Ð¸Ð¼Ð½Ð¾Ð¹ и пÑиÑавнÑÑÑ Ðº пеÑеменной:
if (0) {
var zero = function () {
document.writeln("This is zero.");
};
}
ÐÑимеÑÑ ÐÑимеÑ: возвÑÐ°Ñ Ð¾ÑÑоÑмаÑиÑованного ÑиÑла
ÐÑа ÑÑнкÑÐ¸Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ ÑÑÑокÑ, ÑодеÑжаÑÑÑ ÑиÑло Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñм колиÑеÑÑвом нÑлей пеÑед ним:
function padZeros(num, totalLen) {
var numStr = num.toString(); // ÐниÑиализиÑоваÑÑ Ð²Ð¾Ð·Ð²ÑаÑаемое знаÑение в виде ÑÑÑоки
var numZeros = totalLen - numStr.length; // ÐоÑÑиÑаÑÑ ÑиÑло нÑлей в наÑале
for (var i = 1; i <= numZeros; i++) {
numStr = "0" + numStr;
}
return numStr;
}
ÐÑзовем padZeros
:
var result;
result = padZeros(42, 4); // возвÑаÑÐ°ÐµÑ "0042"
result = padZeros(42, 2); // возвÑаÑÐ°ÐµÑ "42"
result = padZeros(5, 4); // возвÑаÑÐ°ÐµÑ "0005"
ÐÑимеÑ: ÑÑÑеÑÑвÑÐµÑ Ð»Ð¸ ÑÑнкÑиÑ
Ðожно опÑеделиÑÑ, ÑÑÑеÑÑвÑÐµÑ Ð»Ð¸ ÑÑнкÑÐ¸Ñ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¾Ð¿ÐµÑаÑоÑа typeof
. Ð ÑледÑÑÑем пÑимеÑе пÑовеÑÑеÑÑÑ, еÑÑÑ Ð»Ð¸ Ñ Ð¾Ð±ÑекÑа window
ÑÑнкÑÐ¸Ñ noFunc
. ÐÑли еÑÑÑ, Ñо она вÑзÑваеÑÑÑ; еÑли неÑ, вÑполнÑеÑÑÑ ÐºÐ°ÐºÐ¾Ðµ-Ñо дÑÑгое дейÑÑвие.
if ("function" == typeof window.noFunc) {
// вÑзÑваÑÑ noFunc()
} else {
// ÑделаÑÑ ÑÑо-Ñо дÑÑгое
}
ÐамеÑÑÑе, ÑÑо в пÑовеÑке ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð¸ÑполÑзÑеÑÑÑ ÑÑÑлка на noFunc
â поÑле имени ÑÑнкÑии Ð½ÐµÑ Ñкобок, поÑÑÐ¾Ð¼Ñ Ñама ÑÑнкÑÐ¸Ñ Ð½Ðµ вÑзÑваеÑÑÑ.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4