Atunci când un apel de funcție poate fi transferată lor valori sau argumente ale parametrilor respectivi. Funcții folosesc adesea argumentele lor pentru a calcula valoarea de returnare, care este valoarea unei expresii apel de funcție. În plus față de argumentele în apelul orice funcție care îi este o altă valoare care indică contextul unui apel - valoarea cuvântului cheie acest lucru.
Definirea funcțiilor
O definiție funcție începe cu funcția de cuvinte cheie cuvinte cheie. pentru care sunt specificate următoarele elemente:
ID-ul care definește numele funcției
O pereche de paranteze în jurul listei de zero sau mai mulți identificatori separați prin virgulă
Acești identificatori vor determina funcția numele parametrilor din corpul funcției poate fi utilizat ca variabile locale.
Aceste instrucțiuni alcătuiesc corpul funcției au efectuat la fiecare apel funcții.
Exemplul următor prezintă câteva definiții ale funcțiilor în formă de declarații și expresii. Rețineți că definiția funcțiilor în formă de exprimare este utilă numai în cazul în care acestea fac parte dintr-o expresie mai mare, cum ar fi o misiune sau un apel de funcție care efectuează o acțiune folosind caracteristicile recent anunțate:
Expresia care definește o funcție, dimpotrivă, nu declară o variabilă. Cu toate acestea, în stabilirea termenilor pot specifica un nume de funcție, la fel ca în calculul de mai sus a funcției factorial, care pot fi solicitate în corpul funcției să se numească. Dacă expresia este definiția unei funcții include un nume, acest nume va fi referit în funcția obiectului în domeniul de aplicare al acestei funcții. De fapt, numele funcției devine o variabilă locală disponibilă numai în interiorul corpului funcției. În cele mai multe cazuri, numele funcției nu este necesară în definiția termenului, ceea ce face ca definiția mai compactă.
Vă rugăm să rețineți că cele mai multe (dar nu toate) din funcțiile din exemplu să conțină o declarație de returnare. Declarația de retur se termină funcția și returnează valoarea expresiei (dacă este specificat) apelantului. În cazul în care expresia în declarația de returnare nu este disponibilă, se returnează valoarea nedefinită. În cazul în care nu există nici o declarație de întoarcere în funcție, interpretul pur și simplu urmați instrucțiunile din corpul funcției și revine la valoarea apelantului nedefinit.
Cele mai multe dintre funcțiile în exemplul calcularea unei valori, și se întorc declarația este folosită pentru a reveni la această valoare apelantului. printprops () funcția este ușor diferită în acest sens: sarcina sa este de a afișa numele de proprietate obiect. Ea nu a avut nevoie să se întoarcă o valoare, astfel încât nu există nici o instrucțiune în funcție de înapoiere. Funcția printprops () va returna întotdeauna valoarea nedefinită. (Funcție cu nici o valoare de întoarcere, numite uneori proceduri.)
Apelarea funcțiilor
Codul de program, care constituie corpul funcției, nu se efectuează în momentul definirii funcției, și la momentul apelului. Apelarea funcțiilor îndeplinite de exprimarea apelului. Expresia Call constă dintr-o expresie se referă la o funcție care returnează un obiect functie, urmat de o paranteză cu o listă de zero sau mai multe expresii, argumente, separate prin virgulă, în interior.
Dacă expresia este un apel de funcție este o expresie se referă la o proprietate - în cazul în care funcția este o proprietate a obiectului sau a elementului de matrice (adică metoda) - apoi apel expresie este un apel de metoda de exprimare. Următorul fragment prezintă câteva exemple de expresii numesc funcții uzuale:
Când apelarea unei funcții, toate expresiile sunt argumentele evaluate (indicate între paranteze), iar valorile obținute sunt folosite ca argumente ale funcției. Aceste valori sunt atribuite parametri ale căror nume sunt menționate în definiția funcției. Corpul funcției face apel la parametrul de expresie returnează argumentele corespunzătoare.
Atunci când apelați o valoare normală funcție de întoarcere devine valoarea expresiei de apel. Dacă funcția revine după atingerea sfârșit de către interpret, returnează valoarea nedefinită. Dacă funcția returnează un rezultat al executării retur de instrucțiuni, acesta returnează valoarea expresiei, urmând instrucțiunile de returnare, sau nedefinită, în cazul în care declarația de returnare nu este o expresie.
Metoda - este nimeni altul decât funcția care este stocată ca un obiect de proprietate. Dacă există o funcție FUNC și obj obiect, este posibil să se definească o metodă de obj obiectului cu numele metodei, așa cum se arată mai jos:
Cel mai adesea, atunci când apelați metodele utilizate sub formă de tratament pentru proprietăți folosind operatorul punct, dar este la fel de posibil să se utilizeze o formă de adresă la proprietățile folosind paranteze drepte. De exemplu, ambele următoarele expresii sunt expresii de apelare metode:
Argumentele și valoarea de returnare a apelului metodei este procesat în același mod ca și apelarea unei funcții normale. Cu toate acestea, apelul metoda are o diferență importantă: contextul apelului. acces expresia proprietate este format din două părți: un obiect (în acest caz, obj) și numele proprietății (metoda). În acești termeni numesc metode Object obj devine contextul apelului, iar corpul funcției este capabil să se refere la acest obiect folosind cuvântul cheie acest lucru. De exemplu:
Metode și acest cuvânt cheie este esențială pentru paradigma programării orientate-obiect. Orice funcție care este utilizată ca metodă primește de fapt un argument implicit - un obiect cu privire la care a fost numit. De regulă, metodele de a efectua o acțiune asupra obiectului, și sintaxa metoda de apel reflectă în mod clar faptul că funcția funcționează pe obiect.
Argumentele și parametrii funcției
argumente opționale
Atunci când numărul de argumente în apelul funcției este mai mic decât numărul de parametri declarate lipsă de valoare argumente obținute nedefinit. Acesta este adesea convenabil să scrie funcții, astfel încât unele dintre argumentele sunt opționale și pot fi omise atunci când apelarea funcției. În acest caz, este de dorit să se prevadă în mod suficient de atribuire valori implicite rezonabile pentru parametrii care pot fi omise. De exemplu:
liste de argumente de lungime variabilă
În cazul în care numărul de argumente într-un apel de funcție depășește numărul de nume de parametri, funcție lipsiți de posibilitatea de a avea acces direct valorile fără nume. Soluția la această problemă oferă un argumentele obiect. Corpul identificatorului argumentelor funcției se referă la un obiect Argumentele, este prezent în apel. Obiect Argumente - este un obiect, cum ar fi o matrice, care permite pentru a extrage valorile trecut la funcția de numerele lor, mai degrabă decât numele.
Să presupunem că funcția FUNC a fost definită, care necesită un argument x. Dacă apelați această funcție cu două argumente, primul va fi disponibil într-o funcție numită parametrul x sau argumente [0]. Al doilea argument este disponibil numai ca argumente [1]. În plus, la fel ca prezenta matrice, argumente lungime are proprietatea care determină cantitatea elementelor conținute. Aceasta este, în corpul FUNC funcție este apelată cu două argumente, arguments.length este 2.
Funcțiile ca acest lucru și sunt capabili de a accepta orice număr de argumente, numite funcții cu un număr variabil de argumente (funcții variadic, funcții aritate variabile sau varargs funcții). Acest termen are originea odată cu apariția limbajului de programare C.
Rețineți că funcțiile cu un număr variabil de argumente nu trebuie să li se permită să invoce cu o lista de argumente goală. Ar fi rezonabil să se folosească argumentele obiect [] atunci când scrieți o funcție care se așteaptă să primească un număr fix de argumente numite obligatorii, eventual urmate de un număr arbitrar de argumente opționale fără nume.
Nu ar trebui să uităm că argumentele de fapt nu este o matrice - un obiect argumente. Fiecare obiect Argumentele sunt numerotate elemente de matrice și o proprietate lungime, dar din punct de vedere tehnic acest lucru nu este o matrice. Este mai bine să-l trateze ca pe un obiect care are unele proprietăți numerotate.
În plus față de elementele Argumentele sale matrice obiect definește proprietățile apelatul și apelantului. Când încercați să schimbați valorile acestor proprietăți în modul strict ECMAScript 5 este garantată, TypeError excepție. Cu toate acestea, în statele standard de modul non-stricte ECMAScript că proprietatea callee se referă la funcția de executare în prezent. Apelant proprietate nu este standard, dar este prezentă în multe implementări, și se referă la faptul că numita funcția curentă.
proprietate apelant poate fi folosit pentru a accesa stiva de apel, iar proprietatea callee este deosebit de util pentru apeluri recursive funcții fără nume:
Proprietăți și metode de funcții
Proprietatea Lungimea
Corpul de proprietate funcția arguments.length specifică numărul de argumente trecut la funcția. Cu toate acestea, proprietatea lungimea funcției în sine are un sens diferit. Această proprietate este read-only, returnează numărul de argumente că funcția se așteaptă să primească - numărul de parametri declarate.
Codul de mai jos definește un nume de verificare a funcției (), devine o mulțime de argumente din argumentele unei alte funcții. Se compară proprietatea arguments.length (numărul de argumente de fapt, a trecut) cu arguments.callee.length de proprietate (număr de argumente așteptate) pentru a determina dacă funcția a trecut cât mai multe argumente ca se asteapta. Dacă valorile nu se potrivesc, o excepție este aruncată. Pentru verificarea funcției () ar trebui să testeze FUNC funcția (), care arată modul de utilizare a verifica funcția ():
proprietate prototip
Fiecare funcție are o proprietate prototip se referă la un obiect cunoscut ca un obiect prototip. Fiecare funcție are propriul obiect prototip. Când funcția este folosită ca un constructor, obiectul nou creat moștenește proprietățile obiectului prototip.
Prototipuri și proprietate prototip au fost discutate în articolul precedent.
apelați () și se aplică ()
apelați () și se aplică () vă permit să efectuați apel funcția indirectă, ca și cum ar fi fost de o altă entitate. Primul argument pentru ambele metode, apel () și se aplică (), este transferat la obiect în raport cu care este numită funcția; Acest argument specifică contextul apelului și devine valoarea acestui cuvânt cheie în corpul funcției. Pentru a apela FUNC funcția () (fara argumente) ca metodă de obj, puteți utiliza oricare dintre metodele, apel () și se aplică ():
Oricare dintre aceste metode numesc următorul fragment echivalent (în cazul în care se presupune că obj obiect are o proprietate numita m):
În modul strict ECMAScript 5 primul apel argument () și se aplică () devine această valoare, chiar dacă aceasta este o valoare simplă, nulă sau nedefinită. În ECMAScript 3 și un mod de nul non-strictă și valorile nedefinite sunt înlocuite cu un obiect la nivel mondial, valoare simplă - obiect folie corespunzătoare.
Toate celelalte argumente ale apelului metodei () după primul argument, determină contextul apelului, funcția de apelare este transmis. se aplică () apel metoda funcționează ca metoda (), cu excepția faptului că argumentele pentru funcția sunt transmise sub forma unei matrice. Dacă funcția este capabil să se ocupe de un număr arbitrar de argumente, se aplică () metoda poate fi utilizată pentru a apela o funcție în contextul unei matrice de lungimea arbitrară.
Următorul exemplu ilustrează aplicarea practică a apelului metodei ():
bind) Metoda (
bind () metoda a apărut pentru prima dată în ECMAScript 5, dar este ușor de a simula în ECMAScript 3. După cum sugerează și numele, scopul principal al metodei bind () este de a asocia (bind) funcția obiectului. Dacă apelați bind () funcția metoda FUNC și să-l dea obj, acesta va returna o nouă funcție. Apelarea noile caracteristici (cum ar fi o funcție normală) va apela FUNC funcția inițială ca metodă de obj. Orice argumente trecut la noile funcții vor fi transferate la funcția inițială. De exemplu:
O astfel de metodă este ușor de implementat în legarea ECMAScript 3 așa cum se arată mai jos:
bind () metoda în ECMAScript 5 nu este doar caracteristica obiectului. Se efectuează, de asemenea, aplicarea parțială: În plus față de această valoare va fi conectate toate argumentele trecut la metoda bind () după primul argumentului său. aplicarea parțială - a primi o programare funcțională comună și este uneori numită curtau (Prelucrare).