O funcție este un container de declarații de cod care pot fi invocate utilizând parantezele ()
operator. Parametrii pot fi transmise în interiorul parantezelor în timpul invocării, astfel încât instrucțiunile din funcție să poată accesa anumite valori atunci când funcția este invocată.
În următorul cod, creăm două versiuni ale unui addNumbers
funcția objectone folosind nou
operator și altul folosind modelul literar mai comun. Ambii așteaptă doi parametri. În fiecare caz, invocăm funcția, parcurgând parametrii în paranteze ()
operator.
Mostră: sample76.html
O funcție poate fi folosită pentru a returna o valoare, a construi un obiect sau ca un mecanism pentru a rula codul. JavaScript are mai multe utilizări pentru funcții, însă în forma sa cea mai de bază o funcție este pur și simplu un domeniu unic de declarații executabile.
Funcţie()
Parametrii Funcţie()
constructor are un număr nedeterminat de parametri, dar ultimul parametru așteptat de către Funcţie()
constructorul este un șir care conține instrucțiuni care cuprind corpul funcției. Orice parametri transferați constructorului înainte de ultima vor fi disponibili pentru funcția creată. De asemenea, este posibil să trimiteți mai mulți parametri ca șir separat prin virgulă.
În codul următor, contrazic utilizarea Funcţie()
constructorul cu modelele mai comune de instanțiere a unui obiect de funcție.
Mostră: sample77.html
Folosirea directă a Funcţie()
constructorul nu este recomandat sau realizat de obicei pentru că va fi folosit de JavaScript eval ()
pentru a analiza șirul care conține logica funcțiilor. Mulți consideră eval ()
a fi inutile. În cazul în care este în uz, un defect în proiectarea codului este foarte posibil.
Utilizarea Funcţie()
constructor fără nou
cuvântul cheie are același efect ca și utilizarea numai a constructorului pentru a crea obiecte funcționale (Funcție nouă ("x", "întoarcere x")
vs. (('x', 'return x')
).
Nu se creează nicio închidere atunci când se invocă Funcţie()
constructor direct.
Funcţie()
Proprietăți și metodeObiectul funcției are următoarele proprietăți (fără a include proprietățile și metodele moștenite):
Proprietăți (Function.prototype;
):
prototip
Instanțele de obiecte de funcții au următoarele proprietăți și metode (fără a include proprietățile și metodele moștenite):
Proprietăți de instanță (Var myFunction = funcția (x, y, z) ;
myFunction.length;
):
argumente
constructor
lungime
Metode de instanță (Var myFunction = funcția (x, y, z) ;
myFunction.toString ();
):
aplica()
apel()
toString ()
În timp ce este posibil să se creeze o funcție pur și simplu pentru a executa declarații de cod, de asemenea, foarte frecvente pentru o funcție de a returna o valoare. În următorul exemplu, returnează un șir din spune bună
funcţie.
Mostră: sample78.html
Dacă o funcție nu specifică o valoare de retur, nedefinit
este returnat. În exemplul următor, numim scheunat
care înregistrează șirul "yelp" în consola fără a returna în mod explicit o valoare.
Mostră: sample79.html
Conceptul de a lua aici aici este că toate funcțiile returnează o valoare, chiar dacă nu oferiți în mod explicit o valoare pentru a reveni. Dacă nu specificați o valoare pentru returnare, valoarea returnată este nedefinit
.
În JavaScript, funcțiile sunt obiecte. Aceasta înseamnă că o funcție poate fi stocată într-o variabilă, matrice sau obiect. De asemenea, o funcție poate fi transmisă și returnată de la o funcție. O funcție are proprietăți deoarece este un obiect. Toți acești factori fac funcții de cetățeni de primă clasă în JavaScript.
Exemplu: sample80.html
Este esențial să înțelegeți că o funcție este un obiect și deci o valoare. Acesta poate fi trecut în jur sau mărit ca orice altă expresie din JavaScript.
Parametrii sunt vehicule pentru trecerea valorilor în sfera de aplicare a unei funcții atunci când este invocată. În exemplul următor vom invoca addFunction ()
. Deoarece am predefinit-o pentru a lua doi parametri, două valori adăugate devin disponibile în domeniul său de aplicare.
Mostră: sample81.html
Spre deosebire de alte limbi de programare, în JavaScript este perfect legal să omiteți parametrii, chiar dacă funcția a fost definită pentru a accepta aceste argumente. Parametrii lipsă sunt pur și simplu date nedefinit
. Desigur, lăsând valori pentru parametri, este posibil ca funcția să nu funcționeze corect.
Dacă treceți o funcție de parametri neașteptate (cei care nu au fost definiți când a fost creată funcția), nu va apărea o eroare. Și este posibil să accesăm acești parametri din argumente
obiect, care este disponibil pentru toate funcțiile.
acest
și argumente
Valorile sunt disponibile pentru toate funcțiileÎn interiorul sferei și al tuturor funcțiilor, acest
și argumente
sunt disponibile valori.
argumente
obiect este un obiect de tip array care conține toți parametrii care sunt transmiși către funcție. În următorul cod, chiar dacă am renunța la specificarea parametrilor când definim funcția, putem să ne bazăm pe argumente
matricea a trecut la funcția de accesare a parametrilor dacă este trimisă la invocare.
Mostră: sample82.html
acest
cuvânt cheie, trecut la toate funcțiile, este o referință la obiectul care conține funcția. Așa cum v-ați putea aștepta, funcțiile conținute în obiecte ca proprietăți (metode) pot folosi acest
pentru a obține o referință la obiectul părinte. Atunci când o funcție este definită în domeniul global, valoarea lui acest
este obiectul global. Examinați următorul cod și asigurați-vă că înțelegeți ce acest
se întoarce.
Mostră: sample83.html
arguments.callee
Proprietate argumente
obiectul are o proprietate numită callee
, care este o referință la funcția care se execută în prezent. Această proprietate poate fi utilizată pentru a face referire la această funcție din interiorul scopului funcției (arguments.callee
) o auto-referință. În următorul cod, vom folosi această proprietate pentru a obține o referință la funcția de apelare.
Mostră: sample84.html
Acest lucru poate fi util când o funcție trebuie să fie numită recursiv.
lungime
Proprietăți și arguments.length
argumente
obiect are un unic lungime
proprietate. În timp ce s-ar putea să credeți că această proprietate de lungime vă va da numărul de argumente definite, ea de fapt dă numărul de parametri expediați funcției în timpul invocării.
Exemplu: sample85.html
Utilizarea lungime
proprietatea tuturor Funcţie()
de exemplu, putem să luăm de fapt numărul total de parametri pe care funcția așteaptă.
Mostră: sample86.html
arguments.length
proprietatea a fost depreciată în JavaScript 1.4, dar numărul de argumente trimise unei funcții poate fi accesat de la lungime
proprietatea obiectului de funcție. Deplasându-vă în față, puteți obține valoarea lungimii prin utilizarea pârghiei callee
proprietate pentru a obține mai întâi o referință la funcția invocată (arguments.callee.length
).
Parametrii funcțiilor pot fi redefiniți în interiorul funcției fie direct, fie prin utilizarea funcției argumente
matrice. Aruncați o privire la acest cod:
Mostră: sample87.html
Observați că pot redefini valoarea parametrului de bare folosind argumente
index sau prin realocarea directă a unei noi valori a parametrului.
Funcțiile pot fi anulate în orice moment în timpul invocării, utilizând întoarcere
cuvânt cheie cu sau fără o valoare. În exemplul următor, anulează adăuga
dacă parametrii sunt nedefiniți sau nu sunt numere.
Exemplu: sample88.html
Conceptul de a lua aici aici este că puteți anula execuția unei funcții utilizând întoarcere
cuvânt cheie în orice moment în execuția funcției.
O funcție poate fi definită în trei moduri diferite: un constructor de funcții, o instrucțiune de funcție sau o expresie a funcției. În exemplul următor, demonstrez fiecare variație.
Mostră: sample89.html
Unii au spus că există un al patrulea tip de definiție pentru funcții, numit "expresia funcției numită". O expresie a funcției numită este pur și simplu o expresie a funcției care conține și un nume (de ex., var add = funcția add (x, y) return x + y
).
apel()
și aplica()
)Funcțiile sunt invocate folosind patru scenarii sau modele diferite.
aplica()
sau apel()
În următorul exemplu, examinăm fiecare dintre aceste modele de invocare.
Mostră: sample90.html
Asigurați-vă că sunteți conștient de toate cele patru modele de invocare, deoarece codul pe care îl veți întâlni poate conține oricare dintre ele.
O funcție anonimă este o funcție care nu are un identificator. Funcțiile anonime sunt utilizate în principal pentru trecerea funcțiilor ca parametru la o altă funcție.
Mostră: sample91.html
O expresie a funcției (cu adevărat orice funcție, cu excepția unei funcții creată din Funcţie()
constructor) poate fi invocat imediat după definiție prin utilizarea operatorului parantezelor. În următorul exemplu, creăm un sayWord ()
expresia funcției și apoi invocă imediat funcția. Aceasta este considerată a fi o funcție de auto-invocare.
Exemplu: sample92.html
Este posibil să creați o declarație de funcție anonimă care este invocată în mod automat. Aceasta se numește o funcție anonimă invocată de sine. În următorul exemplu, creăm câteva funcții anonime care sunt invocate imediat.
Mostră: sample93.html
Conform standardului ECMAScript, parantezele din jurul funcției (sau orice altceva care transformă funcția într-o expresie) sunt necesare dacă funcția trebuie invocată imediat.
Funcțiile pot fi imbricate în interiorul altor funcții pe o perioadă nedeterminată. În exemplul de cod următor, încapsulează goo
funcționează în interiorul bar
funcția, care este în interiorul foo
funcţie.
Mostră: sample94.html
Simplul concept aici este că funcțiile pot fi imbricate și nu există nici o limită a gradului de adâncime a cuiburilor.
Amintiți-vă, valoarea lui acest
pentru funcțiile imbricate va fi obiectul principal ( fereastră
obiect într-un browser web) în JavaScript 1.5, ECMA-262, Ediția 3.
După cum sa menționat anterior, funcțiile sunt cetățeni de primă clasă în JavaScript. Și deoarece o funcție este o valoare și o funcție poate fi trecută prin orice valoare, o funcție poate fi transferată unei funcții. Funcțiile care iau și / sau returnează alte funcții sunt denumite uneori funcții de ordin superior.
În următorul cod, trecem o funcție anonimă la foo
funcția pe care o vom întoarce imediat de la foo
funcţie. Este această funcție anonimă ca variabila bar
arată, de atunci foo
acceptă și apoi returnează funcția anonimă.
Mostră: sample95.html
Deci când bar
este invocată, invocă funcția anonimă care a fost transmisă foo ()
funcția, care este apoi trecut din spate foo ()
funcția și referință de la bar
variabil. Toate acestea sunt pentru a arăta faptul că funcțiile pot fi transmise la fel ca orice altă valoare.
O instrucțiune de funcție poate fi invocată în timpul executării înainte de definiția sa reală. Acest lucru este un pic ciudat, dar ar trebui să fiți conștient de acest lucru, astfel încât să puteți influența acest lucru sau, cel puțin, să știți ce se întâmplă atunci când îl întâlniți. În exemplul următor, invoc sayYo ()
și sumă()
funcții înainte de a fi definite.
Mostră: sample96.html
Acest lucru se întâmplă deoarece, înainte de a se executa codul, instrucțiunile de funcții sunt interpretate și adăugate în stack / context de execuție. Asigurați-vă că sunteți conștienți de acest lucru pe măsură ce folosiți instrucțiunile de funcții.
Funcțiile definite ca expresii de funcții nu sunt ridicate. Numai instrucțiunile de funcții sunt ridicate.
Este perfect legitim ca o funcție să se numească. De fapt, acest lucru este adesea folosit în modele de codificare binecunoscute. În codul care urmează, vom da startul countDownFrom
care apoi se numește prin numele funcției countDownFrom
. În esență, aceasta creează o buclă care scade de la 5 la 0.
Mostră: sample97.html
Ar trebui să fiți conștienți de faptul că este firesc ca o funcție să se invocă singură (aka recursion) sau să facă acest lucru în mod repetitiv.
Funcțiile sunt unul dintre cele mai utilizate aspecte ale JavaScript, sperăm că acum aveți o mai bună înțelegere a modului de utilizare a acestora.