HTML, Excel, Word, SEOÎñíîâû JavaScript ⇒ Ôóíêöèè JS

ÎÑÍÎÂÛ JavaScript

Ó÷åáíèê JavaScript
·Çíàêîìñòâî ñ JS. Ïåðåìåííûå, îïåðàòîðû, îïåðàöèè
·Ôóíêöèè
·Ìîäåëü HTML äîêóìåíòà
·Èåðàðõèÿ äîêóìåíòîâ â áðàçóåðå
·Ôîðìû
·Îêíà è ôðåéìû
·Ññûëêè, çàãîëîâîê, ñòàòóñ
·Ñîáûòèÿ
·Ñîáûòèÿ êëàâèàòóðû è ìûøè
·Ñîáûòèÿ. Òàéìåð
·Ñòèëè. Óïðàâëåíèå ñòèëÿìè
·Ñëîè è áëîêè. Óïðàâëåíèå âèäèìîñòüþ
·Îáúåêòû JS
·Âíåøíèå îáúåêòû
·Âíóòðåííèå îáúåêòû
·Ìàññèâû
·Ðåãóëÿðíûå âûðàæåíèÿ
·Ìàòåìàòèêà â JS
·Ïðèìåð ïðîñòîãî êàëüêóëÿòîðà
·Äàòà è âðåìÿ
·Cookies è õðàíåíèå ñîñòîÿíèÿ
·Íåìíîãî îá AJAX
·Ðàáîòà ñ WebMoney

 

Ôóíêöèè 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)); 

Ïðè÷åì, â êà÷åñòâå âòîðîãî ïàðàìåòðà ìîæíî ïåðåäàâàòü ñðàçó ôóíêöèþ, íå óòðóæäàÿñü çàíåñåíèåì åå ôóíêöèè â ïåðåìåííóþ. 

Êðîìå îïèñàííîãî ñïîñîáà ñîçäàíèÿ ôóíêöèé, åñòü åùå äâà – íî îíè èñïîëüçóþòñÿ íå íàñòîëüêî ÷àñòî, è î íèõ ÿ íàïèøó â îäíîé èç ñëåäóþùèõ ãëàâ. 

Ñòàíäàðòíûå ôóíêöèè.

Èõ, íà óäèâëåíèå, íå òàê óæ è ìíîãî. Áîëüøàÿ ÷àñòü ïîëåçíûõ ôóíêöèé ðàçíåñåíà ïî âñòðîåííûì îáúåêòàì ÿçûêà (è áðàóçåðà). Íî âñå æå íàøëîñü íåñêîëüêî òàêèõ ôóíêöèé, êîòîðûå íåâîçìîæíî áûëî îòíåñòè ê êàêîìó-íèáóäü îáúåêòó. 

Âîò îíè: 

Òàêæå, âñå âñòðîåííûå îáúåêòû ÿçûêà 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.

Ïðè ýòîì ñòîèò çàìåòèòü, ÷òî åñëè îáúÿâëåíà ëîêàëüíàÿ ïåðåìåííàÿ, òî äîñòóï ê ãëîáàëüíîé ïåðåìåííîé ñ òåì æå èìåíåì çàêðûâàåòñÿ – âñå äåéñòâèÿ ïåðåìåííûõ áóäóò ïðîèñõîäèòü ñ ëîêàëüíîé ïåðåìåííîé. 

È, ñîáñòâåííî, àðãóìåíòû ôóíêöèè àâòîìàòè÷åñêè ñòàíîâÿòñÿ ëîêàëüíûìè ïåðåìåííûìè. 

À òåïåðü, äëÿ ñàìîïðîâåðêè, ÿ ïðåäëàãàþ âàì íåáîëüøîå çàäàíèå: ïîïðîáóéòå íàïèñàòü ôóíêöèþ, êîòîðàÿ âîçâðàùàåò êîïèþ ïåðåäàííîãî åé îáúåêòà. 

Êàê ïîêàçûâàåò ìîé ñîáñòâåííûé îïûò, ñ ïåðâîãî ðàçà ìîæåò íå ïîëó÷èòüñÿ, íî ýòî âïîëíå âîçìîæíî (êàê ïîêàçûâàåò âñå òîò æå îïûò). 



 íà÷àëî ñòðàíèöû



 íà÷àëî ñòðàíèöû