Ôóíêöèè JS
Ïàðàìåòðû ôóíêöèé. Îáëàñòè âèäèìîñòè. Çíà÷åíèå è ññûëêà
Ñîçäàíèå ôóíêöèé.
Òå ñêðèïòû, êîòîðûå ìû ðàññìàòðèâàëè äî ýòîãî âðåìåíè, áûëè î÷åíü íåáîëüøèìè, ìîæíî ñêàçàòü – íà îäèí ýêðàí ðåäàêòîðà. È âåñü êîä áûë âèäåí îäíîâðåìåííî. Íî åñëè ïðåäñòàâèòü, ÷òî ñêðèïò çàíèìàåò íå ïÿòíàäöàòü ñòðî÷åê, à âñå ïîëòîðû òûñÿ÷è – êàê â íåì ðàçîáðàòüñÿ?
Òîò êîä, êîòîðûé ìû ïèñàëè, èñïîëüçîâàëñÿ ñðàçó, è â îäíîì åäèíñòâåííîì ìåñòå. Íî åñëè ïðåäñòàâèòü, ÷òî îäèí è òîò æå êîä äîëæåí èñïîëíÿòüñÿ â ñîðîêà ðàçíûõ ìåñòàõ, äà åùå è òîëüêî òîãäà, êîãäà íàñòóïèò íóæíîå âðåìÿ...
Òà ïîñëåäîâàòåëüíîñòü êîìàíä, êîòîðàÿ âûïîëíÿëà íåîáõîäèìûå íàì äåéñòâèÿ, äî ñèõ ïîð íå âûçûâàëà çàòðóäíåíèé â ïîíèìàíèè. Íî åñëè ýòà ïîñëåäîâàòåëüíîñòü áóäåò ñëèøêîì ñëîæíà äëÿ òîãî ÷òîáû ïðî÷åñòü åå çà îäèí ðàç...
Ñîáñòâåííî, âñå ýòè ïðîáëåìû ðåøàþòñÿ, è óæå äîñòàòî÷íî äàâíî, ïðè ïîìîùè ôóíêöèé.
×òî æå òàêîå ôóíêöèÿ? Åñëè íå âäàâàòüñÿ â ïîäðîáíîñòè (à íà ïåðâûõ ïîðàõ ýòè ïîäðîáíîñòè áóäóò òîëüêî ìåøàòü) ôóíêöèÿ ïðåäñòàâëÿåò èç ñåáÿ íåêîòîðûé áëîê êîäà, êîòîðîìó äàëè èìÿ. Íàïðèìåð, âîò òèïè÷íîå îáúÿâëåíèå ôóíêöèè:
function diff(a,b) { if (a>b) { return a – b; } else { return b – a; } }
 ýòîì êîäå îáúÿâëÿåòñÿ ôóíêöèÿ ïîä èìåíåì diff (èìåííî òàê ê íåé ìîæíî áóäåò îáðàùàòüñÿ â òåêñòå ïðîãðàììû). Ýòà ôóíêöèÿ îæèäàåò äâà ïàðàìåòðà – a è b.
Ïðè âûçîâå ëþáûå çíà÷åíèÿ, êîòîðûå áûëè ïåðåäàíû ôóíêöèè, çàïèøóòñÿ â ïåðåìåííûå a è b âíóòðè òåëà ôóíêöèè (êîäà ìåæäó ôèãóðíûìè ñêîáêàìè), è ê íèì ìîæíî áóäåò îáðàùàòüñÿ ïî ýòèì èìåíàì.
Îïåðàòîð return (äà, ýòî åùå îäèí îïåðàòîð, êîòîðûé ìîæíî ïðèìåíÿòü òîëüêî âíóòðè òåëà ôóíêöèè) çàâåðøàåò âûïîëíåíèå áëîêà êîäà è âîçâðàùàåò çíà÷åíèå, åñëè îíî åñòü.
Ýòà ôóíêöèÿ ìîæåò áûòü âûçâàíà âîò òàê:
var c = diff(4, 7); var d = diff(c, 12);
Êàê âû âèäèòå, ôóíêöèÿ, êîòîðàÿ áûëà îáúÿâëåíà âûøå, âûçûâàåòñÿ ñ äâóìÿ ïàðàìåòðàìè, è âîçâðàùàåò çíà÷åíèå, êîòîðîå ìîæíî çàïèñàòü â ïåðåìåííóþ èëè èñïîëüçîâàòü (èëè íå èñïîëüçîâàòü) ëþáûì äðóãèì îáðàçîì.
Ïðè âûçîâå ôóíêöèè íóæíî ïîìíèòü, ÷òî ýòà ôóíêöèÿ äîëæíà áûòü îáúÿâëåíà èëè â òåêóùåì áëîêå êîäà, èëè â îäíîì èç ïðåäûäóùèõ, èíà÷å áðàóçåð âûäàñò îøèáêó.
 ïðèâåäåííîì ïðèìåðå îäèí è òîò æå êîä áûë ïðèìåíåí äâà ðàçà, ïðè÷åì äåéñòâèÿ, êîòîðûå îí âûïîëíèë, çàâèñåëè îò òîãî, ÷òî èìåííî áûëî ïåðåäàíî â ôóíêöèþ.
Äóìàþ, âàñ íå óäèâèò òîò ôàêò, ÷òî âíóòðè îäíîé ôóíêöèè ìîæíî âûçûâàòü äðóãóþ ôóíêöèþ (åñëè âûçûâàåìàÿ ôóíêöèÿ óæå îáúÿâëåíà).
Íàïðèìåð:
function inner(a) { return a + 2; } function outer(x) { var intermediate = inner(x); intermediate += inner(x*x); return intermediate; }
Êñòàòè, òàêèì æå îáðàçîì ôóíêöèÿ ìîæåò âûçûâàòü ñàìà ñåáÿ. Òàêîé âûçîâ íàçûâàåòñÿ ðåêóðñèåé.
Âîò, ïðèìåð ïðîñòîé ôóíêöèè ñ ðåêóðñèåé:
function countback(num) { if (num > 0) { alert(num); countback(num-1); } }
 ýòîé ôóíêöèè îáÿçàòåëüíî ïðèñóòñòâóåò óñëîâèå, êîòîðîå îïðåäåëÿåò, íóæíî åùå ðàç âûçâàòü ýòó æå ôóíêöèþ, èëè íåò.
 ÷åì-òî òàêèå ðåêóðñèâíûå ôóíêöèè ïîõîæè íà öèêëû (è áîëüøóþ ÷àñòü öèêëîâ ìîæíî ïåðåïèñàòü â âèäå ðåêóðñèâíûõ ôóíêöèé, è íàîáîðîò).
 ðåêóðñèâíîé ôóíêöèè îáÿçàòåëüíî åñòü óñëîâèå è êàêîé-íèáóäü èçìåíÿåìûé ïàðàìåòð.
Åñëè âû âñïîìíèòå ïðåäûäóùóþ ãëàâó, òî òàêæå âñïîìíèòå, ÷òî ôóíêöèÿ â JavaScript òîæå ÿâëÿåòñÿ òèïîì. È ôóíêöèþ ìîæíî çàïèñàòü â ïåðåìåííóþ. Ïîíà÷àëó ýòî êàæåòñÿ ñòðàííûì, îñîáåííî äëÿ òåõ, êòî óæå ñòàëêèâàëèñü ñ ÿçûêàìè âðîäå C, Java èëè PHP.
Íî íà ñàìîì äåëå íè÷åãî ñëîæíîãî â ýòîì íåò.
Íàïðèìåð, âîò òàêàÿ çàïèñü:
function fnc(a) { return a + 1; } var f = fnc;
ñîçäàñò ôóíêöèþ fnc() è çàïèøåò åå â ïåðåìåííóþ f.
Åñëè áûòü òî÷íûì, òî çàïèøåòñÿ íå ñàìà ôóíêöèÿ, à òîëüêî ññûëêà íà íåå, íî ê ýòîé ðàçíèöå ÿ âåðíóñü íåñêîëüêî ïîçæå.
Èòàê, ïðè èñïîëíåíèè áðàóçåðîì ýòîãî êîäà áóäåò ñîçäàíà ôóíêöèÿ. Èç çàïèñè ïîíÿòíî, ÷òî îíà áóäåò ïîëó÷àòü îäèí ïàðàìåòð, è áóäåò âîçâðàùàòü çíà÷åíèå.
Ïðè ýòîì âîçìîæåí êàê âûçîâ ôóíêöèè íàïðÿìóþ, ïðè ïîìîùè èìåíè fnc(), òàê è ïîñðåäñòâîì ïåðåìåííîé f, òîæå – ïðîñòî íàïèñàâ ñêîáêè çà èìåíåì. Âîò òàê : f()
Ïîñêîëüêó ôóíêöèÿ òåïåðü ÿâëÿåòñÿ çíà÷åíèåì ïåðåìåííîé, òî ýòî çíà÷åíèå ìîæíî çàïèñûâàòü â äðóãèå ïåðåìåííûå è ïåðåäàâàòü â äðóãèå ôóíêöèè.
Íàïðèìåð, òàêîé êîä áóäåò âïîëíå ðàáîòîñïîñîáíûì (è, êðîìå òîãî, ýòîò ñïîñîá ÷àñòü èñïîëüçóåòñÿ è ïðèíîñèò íåïëîõèå ðåçóëüòàòû):
function compare(a) { return a > 12; } var user_func = compare; function check (arr, fn) { var passed = 0; for (var i=0; i<arr.length; i++) { if (fn(arr[i])) { passed++; } } return passed; } alert (check([1,5,15,34,2,32,44], user_func));
Ïðè÷åì, â êà÷åñòâå âòîðîãî ïàðàìåòðà ìîæíî ïåðåäàâàòü ñðàçó ôóíêöèþ, íå óòðóæäàÿñü çàíåñåíèåì åå ôóíêöèè â ïåðåìåííóþ.
Êðîìå îïèñàííîãî ñïîñîáà ñîçäàíèÿ ôóíêöèé, åñòü åùå äâà – íî îíè èñïîëüçóþòñÿ íå íàñòîëüêî ÷àñòî, è î íèõ ÿ íàïèøó â îäíîé èç ñëåäóþùèõ ãëàâ.
Ñòàíäàðòíûå ôóíêöèè.
Èõ, íà óäèâëåíèå, íå òàê óæ è ìíîãî. Áîëüøàÿ ÷àñòü ïîëåçíûõ ôóíêöèé ðàçíåñåíà ïî âñòðîåííûì îáúåêòàì ÿçûêà (è áðàóçåðà). Íî âñå æå íàøëîñü íåñêîëüêî òàêèõ ôóíêöèé, êîòîðûå íåâîçìîæíî áûëî îòíåñòè ê êàêîìó-íèáóäü îáúåêòó.
Âîò îíè:
-
eval() : ïîçâîëÿåò âûïîëíèòü ñòðîêó êàê javascript-êîä. Ýòî áûâàåò ïîëåçíî êîãäà êîä ïðèõîäèò èç âíåøíåãî èñòî÷íèêà (íàïðèìåð, îò ñåðâåðà) èëè åñëè îí ôîðìèðóåòñÿ â õîäå âûïîëíåíèÿ ñêðèïòà.
-
parseInt(), parseFloat() : ýòè ôóíêöèè ïðåäíàçíà÷åíû äëÿ òîãî, ÷òîáû ïðåâðàùàòü ñòðîêó â ÷èñëî (ñ ó÷åòîì ñèñòåìû ñ÷èñëåíèÿ). Íàïðèìåð, ìîæíî ñâîáîäíî ðàáîòàòü ñ äâîè÷íûìè, âîñüìåðè÷íûìè èëè (äëÿ îðèãèíàëîâ) ñ ïÿòåðè÷íûìè ÷èñëàìè.
Ïåðâàÿ ðàáîòàåò ñ öåëûìè ÷èñëàìè, âòîðàÿ – ñ ÷èñëàìè ñ ïëàâàþùåé òî÷êîé.
-
encodeURI(), decodeURI(), encodeURIComponent(), decodeURIComponent() : Ýòè ôóíêöèè ïðåäíàçíà÷åíû äëÿ ðàáîòû ñ URI (Uniform Resource Identifier). Ýòîò ñòàíäàðò òðåáóåò, ÷òîáû íåêîòîðûå ñèìâîëû îòñóòñòâîâàëè â URI, è óêàçàííûå ôóíêöèè äëÿ ïðåîáðàçîâàíèÿ ýòèõ ñèìâîëîâ.
-
isNaN() : Áûâàþò ñëó÷àè, êîãäà ÷èñëîâàÿ îïåðàöèÿ íè ïðè êàêèõ óñëîâèÿõ íå ìîæåò âåðíóòü ÷èñëî. Íàïðèìåð, ïðè ïîïûòêå ïðåîáðàçîâàíèÿ ñòðîêè «hello» ñ ïîìîùüþ ôóíêöèè parseInt.  òàêîì ñëó÷àå èñïîëüçóåòñÿ ñïåöèàëüíîå íå÷èñëîâîå çíà÷åíèå (òàê íàçûâàåìîå «íå-÷èñëî», NaN). Äëÿ ïðîâåðêè, ÿâëÿåòñÿ ëè àðãóìåíò ýòèì íå-÷èñëîì, è èñïîëüçóåòñÿ óêàçàííàÿ ôóíêöèÿ.
-
isFinite() : Î÷åíü ïîõîæà íà ïðåäûäóùóþ, íî êðîìå NaN òàêæå ïðîâåðÿåò Infinite (òî åñòü áåñêîíå÷íîñòü).
Òàêæå, âñå âñòðîåííûå îáúåêòû ÿçûêà JavaScript îäíîâðåìåííî ÿâëÿþòñÿ ôóíêöèÿìè (è íàîáîðîò). Âû ïîéìåòå, ïî÷åìó ýòî òàê êîãäà óçíàåòå, êàê èìåííî ñîçäàþòñÿ îáúåêòû, êðîìå îïèñàííîãî ìíîé ëèòåðàëüíîãî ñïîñîáà (òî åñòü ôèãóðíûõ ñêîáîê). Òàê ÷òî âûçîâû âèäà
var a = String(23);
âïîëíå äîïóñòèìû.
Ñåé÷àñ âû ìîæåòå ñïðîñèòü, ïî÷åìó â ýòîì ñïèñêå íåò ôóíêöèè alert().
Äåéñòâèòåëüíî, õîòÿ ìû è èñïîëüçîâàëè ýòó ôóíêöèþ áåç ïðåäâàðèòåëüíîãî îáúÿâëåíèÿ, è íå óêàçûâàëè îáúåêò ê êîòîðîìó îíà îòíîñèòñÿ, ýòà ôóíêöèÿ íå ÿâëÿåòñÿ ñòàíäàðòíîé ôóíêöèåé ÿçûêà.
Âñå äåëî â òîì, ÷òî êðîìå ñòàíäàðòíûõ ôóíêöèé, áåç óêàçàíèÿ îáúåêòà ìîãóò âûçûâàòüñÿ ôóíêöèè îáúåêòà window. Âîîáùå, ëþáûå ãëîáàëüíûå ïåðåìåííûå è ôóíêöèè ÿâëÿþòñÿ ïåðåìåííûìè è ôóíêöèÿìè îáúåêòà window.
Íàïðèìåð, êîãäà ìû âìåñòî òîãî ÷òîáû íàïèñàòü
var a = 2;
ïèøåì
a = 2;
ìû äîáàâëÿåì ïåðåìåííóþ a ê îáúåêòó window. Ïðè ýòîì, ñëåäóåò çàìåòèòü, åñòü íåêîòîðûå òîíêîñòè. Èñïîëüçîâàíèå íåîáúÿâëåííîé ïåðåìåííîé âûçîâåò îøèáêó, à èñïîëüçîâàíèå íåîáúÿâëåííîãî ñâîéñòâà îáúåêòà ïðîñòî âåðíåò undefined
Ïàðàìåòðû ôóíêöèé. Îáëàñòè âèäèìîñòè. Çíà÷åíèå è ññûëêà.
Êîãäà ìû îáúÿâëÿëè ôóíêöèþ, ìû óêàçûâàëè ïàðàìåòðû, êîòîðûå îíà áóäåò ïðèíèìàòü. Íî, êðîìå ýòèõ ïàðàìåòðîâ, âíóòðè ôóíêöèè òàêæå ìîãóò èñïîëüçîâàòüñÿ ãëîáàëüíûå ïåðåìåííûå, è ñîçäàâàòüñÿ ëîêàëüíûå. Äà è ñ ïàðàìåòðàìè íå âñå òàê ïðîñòî, êàê êàæåòñÿ.
Íàïðèìåð, îáúÿâëÿåì ìû ôóíêöèþ âîò òàê:
function x(a,b,c) { }
À âûçûâàåì òàê:
x(1,2);
Êàê âû äóìàåòå, ÷òî áóäåò?
Íåò, áðàóçåð íå âûäàñò îøèáêó, õîòÿ ôóíêöèÿ è ïîëó÷èëà ìåíüøå ïàðàìåòðîâ, ÷åì îæèäàëà.
Ïðîñòî ïðè âûçîâå ýòîé ôóíêöèè ïàðàìåòðû a è b ïðèìóò ñîîòâåòñòâåííî çíà÷åíèÿ 1 è 2, à âîò ïàðàìåòð c îêàæåòñÿ undefined
Òàêæå ìû ìîãëè áû íàïèñàòü è
x(1,2,3,4,5);
È äàæå â ýòîì ñëó÷àå íèêàêîé îøèáêè íå áóäåò. Ïàðàìåòðû 4 è 5 íèêóäà íå èñ÷åçíóò, à áóäóò íàõîäèòüñÿ â «òðóäíîäîñòóïíûõ» ìåñòàõ.
Çäåñü ñòîèëî áû íåìíîãî áîëüøå ñêàçàòü î òîì, ÷òî ôóíêöèÿ ÿâëÿåòñÿ îáúåêòîì.
Òàê, ó ëþáîé ôóíêöèè ïîñëå ñîçäàíèÿ åñòü ñâîéñòâà è ìåòîäû (åñëè ÿ åùå íå ãîâîðèë, òî ìåòîäîì íàçûâàåòñÿ ñâîéñòâî, ÿâëÿþùååñÿ ôóíêöèåé – çàïóòàíî, ïðàâäà?). Íàïðèìåð, äëÿ îáúÿâëåííîé âûøå ôóíêöèè x ìîæíî âûçâàòü ìåòîä toString():
var a = x.toString();
È â ðåçóëüòàòå â ïåðåìåíîé a îêàæåòñÿ ñòðîêà «function x(a,b,c){}»
Êðîìå ýòîãî, âíóòðè òåëà ôóíêöèè âñåãäà ìîæíî èñïîëüçîâàòü îáúåêò arguments, ïðè ïîìîùè êîòîðîãî è ìîæíî áûëî áû äîáðàòüñÿ äî ïàðàìåòðîâ 4 è 5 ïðè âûçîâå ôóíêöèè ñ ïîìîùüþ êîìàíäû
x(1,2,3,4,5);
Êðîìå òîãî, ñëåäóåò ñêàçàòü î ïåðåäà÷å ïàðàìåòðîâ ïî ññûëêå.
Íàïðèìåð, åñëè ìû ïåðåäàåì â ôóíêöèþ ÷èñëî, òî îíî ïåðåäàåòñÿ ïî çíà÷åíèþ – òî åñòü âíóòðè ôóíêöèè ñîçäàåòñÿ êîïèÿ ïàðàìåòðà, è óæå ñ ýòîé êîïèåé è ïðîèñõîäèò âñÿ ðàáîòà.
Íî â ñëó÷àå, åñëè â ôóíêöèþ ïåðåäàåòñÿ îáúåêò (èëè ìàññèâ, èëè äàæå ôóíêöèÿ) – âñå ïðîèñõîäèò íåìíîãî èíà÷å.
Äåëî â òîì, ÷òî äàæå êîãäà ìû ïðîñòî ïðèñâàèâàåì ïåðåìåííîé çíà÷åíèå îáúåêòà, ýòà ïåðåìåííàÿ õðàíèò íå ñàì îáúåêò, à òîëüêî ññûëêó íà íåãî.
 ðåçóëüòàòå, ïîñëå òàêèõ êîìàíä
var a = {'a':1}; var b = a;
îáå ïåðåìåííûå áóäóò óêàçûâàòü íà îäèí è òîò æå îáúåêò, è ïðè òàêîì âîò äåéñòâèè
a.x = 2;
ìîæíî áóäåò îáðàùàòüñÿ ê b.x, è òàì áóäåò ñîäåðæàòüñÿ òà æå ñàìàÿ äâîéêà.
Òî æå ñàìîå ïðîèñõîäèò è ïðè âûçîâå ôóíêöèè – àðãóìåíò áóäåò ñîäåðæàòü ññûëêó íà îáúåêò. È òàê æå òî÷íî ëþáûå èçìåíåíèÿ ýòîãî îáúåêòà (ïðè îáðàùåíèè ê íåìó ÷åðåç àðãóìåíò ôóíêöèè) íå èñ÷åçíóò ïîñëå çàâåðøåíèÿ ôóíêöèè.
Òàêîå ïîâåäåíèå îáúåêòîâ èíîãäà ïðè÷èíÿåò íåóäîáñòâà ïðîãðàììèñòó – èíîãäà ïðèõîäèòñÿ èäòè íà óõèùðåíèÿ, ÷òîáû ïîëó÷èòü êîïèþ îáúåêòà, íî î÷åíü ÷àñòî ýòî áûâàåò óäîáíî.
Ó÷èòûâàÿ òàêóþ ðàçíèöó â ïîâåäåíèè ðàçíûõ òèïîâ, áûëî áû íåïëîõî îïðåäåëÿòü, ñ êàêèì ñîáñòâåííî òèïîì ïðèõîäèòñÿ ðàáîòàòü. È äëÿ ýòîãî â ÿçûêå JavaScript ñóùåñòâóþò öåëûõ äâà îïåðàòîðà – typeof è instanceof.
Ïåðâûé èç íèõ âîçâðàùàåò òèï îïåðàíäà (â âèäå ñòðîêè) – íàïðèìåð,
typeof {a:1};
âåðíåò ñòðîêó «object»
Âòîðîé îïåðàòîð ïîêàçûâàåò, ÿâëÿåòñÿ ëè ïåðâûé îïåðàíä (îáúåêò) ýêçåìïëÿðîì âòîðîãî îïåðàíäà (òîæå îáúåêòà). Ýòî ïîëåçíî â òîì ñëó÷àå, êîãäà íàì íóæíî ïðîâåðèòü, ÿâëÿåòñÿ ëè ïåðåäàííûé îáúåêò ìàññèâîì èëè, íàïðèìåð, äàòîé (òî åñòü ýòî îáúåêò – ýêçåìïëÿð âñòðîåííîãî îáúåêòà Array èëè âñòðîåííîãî îáúåêòà Date). Íî îá ýòîì îïåðàòîðå, à òàêæå î âîïðîñàõ íàñëåäîâàíèé è îáúåêòîâ ÿ ðàññêàæó â ñîîòâåòñòâóþùåé ãëàâå.
À ñåé÷àñ âåðíåìñÿ ê ôóíêöèÿì.
Âíóòðè òåëà ôóíêöèè, êðîìå ïðèøåäøèõ èçâíå îïåðàíäîâ, ìîãóò îáúÿâëÿòüñÿ è äðóãèå ïåðåìåííûå (ïðè ïîìîùè îïåðàòîðà var).  ýòîì ñëó÷àå ïåðåìåííàÿ áóäåò ëîêàëüíîé – òî åñòü îíà íå áóäåò âèäíà ñíàðóæè ôóíêöèè.
Åñëè æå ìû èñïîëüçóåì íåîáúÿâëåííóþ âíóòðè ôóíêöèè ïåðåìåííóþ, òî ýòî áóäåò ëèáî ãëîáàëüíàÿ ïåðåìåííàÿ (òî÷íåå, âíåøíÿÿ – áóäåò èñïîëüçîâàòüñÿ ïåðåìåííàÿ èç òîé ôóíêöèè, âíóòðè êîòîðîé îáúÿâëåíà òåêóùàÿ, èëè èç ôóíêöèè, â êîòîðîé îáúÿâëåíà ôóíêöèÿ, â êîòîðîé îáúÿâëåíà òåêóùàÿ ôóíêöèÿ, è òàê äàëåå), ëèáî ñâîéñòâî îáúåêòà window.
Ïðè ýòîì ñòîèò çàìåòèòü, ÷òî åñëè îáúÿâëåíà ëîêàëüíàÿ ïåðåìåííàÿ, òî äîñòóï ê ãëîáàëüíîé ïåðåìåííîé ñ òåì æå èìåíåì çàêðûâàåòñÿ – âñå äåéñòâèÿ ïåðåìåííûõ áóäóò ïðîèñõîäèòü ñ ëîêàëüíîé ïåðåìåííîé.
È, ñîáñòâåííî, àðãóìåíòû ôóíêöèè àâòîìàòè÷åñêè ñòàíîâÿòñÿ ëîêàëüíûìè ïåðåìåííûìè.
À òåïåðü, äëÿ ñàìîïðîâåðêè, ÿ ïðåäëàãàþ âàì íåáîëüøîå çàäàíèå: ïîïðîáóéòå íàïèñàòü ôóíêöèþ, êîòîðàÿ âîçâðàùàåò êîïèþ ïåðåäàííîãî åé îáúåêòà.
Êàê ïîêàçûâàåò ìîé ñîáñòâåííûé îïûò, ñ ïåðâîãî ðàçà ìîæåò íå ïîëó÷èòüñÿ, íî ýòî âïîëíå âîçìîæíî (êàê ïîêàçûâàåò âñå òîò æå îïûò).