• Dom
  • Windows telefon
  • Javascript koji koristi prethodno deklariranu funkciju u drugoj. Funkcije

Javascript koji koristi prethodno deklariranu funkciju u drugoj. Funkcije

Članak u izradi!

Članak u kojem razmatramo što je funkcija, kao i tradicionalnu (klasičnu) verziju rada s njom. Osim toga, analizirat ćemo koji su argumenti (parametri) funkcije i povratne izjave.

Šta je funkcija?

Funkcija je neka set instrukcija, koji se može imenovati i zatim oslovljavajte ga ovim imenom sa bilo kojeg mjesta u programu.

Klasičan primjer korištenja funkcije. Web stranica sadrži JavaScript kod, neki fragment u kojem se ponavlja nekoliko puta. Da biste to izbjegli, možete formatirajte ovaj isječak kao funkciju, a onda nazovi na pravim mjestima u kodu po imenu ove funkcije. Pozivanje ove funkcijeće značiti izvršenje instrukcija nalazi u njemu.

Kako organizirati izvršavanje nekog zadatka u JavaScriptu koristeći funkcije? Da biste to učinili, obično radite nešto poput ovoga:

  • podijeliti zadatak na sastavne dijelove (podzadatke);
  • podzadaci su formalizirani kroz funkcije;
  • razviti glavni kod koristeći poziv kreiranih funkcija.

Kao rezultat, takav program postaje više strukturiran. Lakše je napraviti razne promjene i dodati nove funkcije.

Deklarisanje i pozivanje funkcije

Funkcionalne operacije u JavaScript-u mogu se podijeliti u 2 koraka:

  • najava (kreacija) funkcije.
  • poziv (izvršenje) ovu funkciju.

Deklaracija funkcije. Kreiranje funkcije u JavaScript-u počinje pisanjem ključne riječi funkcije, nakon čega slijedi naziv funkcije, nakon čega slijedi x u zagradi, ako je potrebno. parametri su navedeni, nakon čega slijede upute koje zatvoreno u vitičaste zagrade.

// deklaracija funkcije someName funkcija someName() ( alert("Pozvali ste funkciju someName!"); ) JavaScript - Sintaksa deklaracije funkcije

Funkcije ove vrste u JavaScript-u se pozivaju izjava deklaracije funkcije. Osim ovog tipa, JavaScript također razlikuje funkcije izraz definicije funkcije i izraz funkcije strelice.

Sastav imena funkcije slijedi ista pravila kao i naziv varijable. One. može sadržavati slova, brojeve (0-9), znakove "$" i "_". Preporučljivo je koristiti samo slova engleske abecede (a-z, A-Z) kao slova. Ime funkcije, kao i ime varijable, ne može početi brojem.

Funkcija može imati bilo koji broj parametara ili uopće ne imati. Zagrade su uključene u svakom slučaju. Ako postoji nekoliko parametara, onda se moraju odvojiti jedan od drugog zarezom. Parametrima funkcije pristupa se po njihovom imenu.

Set instrukcija, zatvoren u vitičaste zagrade, je kod funkcije koji će se izvršiti kada se pozove.

Poziv funkcije. Deklarisana funkcija sama neće biti izvedena. Da bi se pokrenuo, mora se pozvati. Funkcija se poziva navođenjem njenog imena i dvije zagrade. Argumenti su dati unutar zagrada, ako je potrebno.

// pozivamo funkciju datu u prethodnom primjeru someName(); JavaScript - Sintaksa poziva funkcije

Je li funkcija u JavaScript-u objekt?

Funkcije u JavaScriptu su objekti. Sve u JavaScriptu je objekt osim šest primitivnih tipova podataka. A ako je funkcija objekt, onda se referenca na nju može pohraniti u varijablu.

// deklaracija funkcije someName funkcija someName() ( alert("Pozvali ste funkciju someName!"); ) var reference = someName;

Nakon toga, možete pozvati funkciju ovako:

Referenca();

Parametri i argumenti funkcije

Argumenti funkcije su vrijednosti koje se prosljeđuju funkciji u fazi njenog poziva. Argumenti se odvajaju jedan od drugog zarezom.

// pozivanje sayWelcome funkcije s dva argumenta koja su joj proslijeđena sayWelcome("Ivan", "Ivanov"); // još jedan poziv sayWelcome funkcije sa dva argumenta sayWelcome("Peter", "Petrov");

Parametri funkcije je jedan od načina u JavaScriptu za upućivanje na argumente unutar funkcije. Parametri funkcije su opisani u fazi njene deklaracije u zagradama.

Drugim riječima parametri funkcije su lokalne varijable koje se kreiraju automatski u fazi pokretanja funkcije. Kao vrijednosti, parametri primaju odgovarajuće argumente proslijeđene funkciji tokom njenog poziva. Parametrima možete pristupiti samo unutar ove funkcije, izvan nje oni ne postoje.

// deklaracija funkcije sayWelcome, koja ima dva parametra funkciju sayWelcome (userFirstName, userLastName) ( // instrukcija koja prikazuje vrijednosti parametara "userFirstName" i "userLastName" na konzoli console.log("Welcome, " + userLastName + " " + userFirstName ); )

U JavaScriptu, prilikom pozivanja funkcije broj argumenata ne mora biti isti kao i broj parametara. Parametri koji nisu bili postavljeni na vrijednost prilikom poziva bit će nedefinirani.

Na primjer, pozovimo funkciju iz gornjeg primjera, bez navođenja jednog i dva parametra:

// poziva funkciju sayWelcome i prosljeđuje joj jedan argument sayWelcome("Peter"); // Welcome, undefined Peter // poziva funkciju sayWelcome bez prosljeđivanja argumenata sayWelcome(); // Dobrodošli undefined undefined

Primjer funkcije koja će jednostavno prikazati argumente koji su joj proslijeđeni u konzoli preglednika:

// deklaracija funkcije funkcija outputParam(param1, param2, param3) ( console.log(param1 + "; " + param2 + "; " + param3); ) // poziva funkciju outputParam prenoseći joj drugačiji broj parametara outputParam(" Kiša", "Snijeg", "Magla"); // Kiša; Snijeg; magla outputParam(17); // 17; nedefinisano; undefined outputParam(24,33); // 24; 33; undefined outputParam(); // undefined; nedefinisano; nedefinisano

Drugi način upućivanja na argumente unutar funkcije je korištenje objekta posebnih argumenata. Pristup argumentima putem argumenata vrši se na isti način kao i elementima regularnog niza, tj. po njihovim serijskim brojevima. Dakle, argument - će vam omogućiti da dobijete prvi argument, argumenti - drugi argument i tako dalje.

// deklaracija funkcije sum funkcija sum(num1, num2) ( /* broj1 ili argumenti - dobije se vrijednost 1 argumenta broj2 ili argumenata - dobije vrijednost 2 argumenta */ var sum1 = broj1 + broj2, sum2 = argumenti + argumenti; return "Zbroj, dobijen metodom 1 je " + sum1 + "; suma dobijen metodom 2 je " + sum2; ) /* ispisuje rezultat funkcije sum na konzoli 7 - prvi argument (može se pristupiti i putem naziv num1 i po argumentima) 4 - drugi argument (može mu se pristupiti i po imenu broj2 i po argumentima) */ console.log(sum(7,4));

Glavna razlika između ovih metoda je u tome što prva od njih omogućava pristup samo onim argumentima koji su dobili imena u fazi deklariranja funkcije. Druga metoda vam omogućava da dobijete vrijednost bilo kojeg argumenta, čak i ako nema ime (po serijskom broju). Ova karakteristika JavaScript jezika omogućava vam da kreirate univerzalne fleksibilne funkcije.

Osim primanja argumenata, objekt arguments vam također omogućava da saznate njihov broj. Ovo se radi pomoću svojstva dužine.

Iterirajte argumente proslijeđen funkciji, na primjer, korištenjem for ili for...of petlje.

// deklaracija funkcije sum funkcija sum() ( var i = 0; console.log("Izlaz svih argumenata koristeći for petlju"); for (i; i< arguments.length; i++) { console.log(i + 1 + " аргумент равен " + arguments[i]); } console.log("Вывод всех аргументов с помощью цикла for...of"); for (arg of arguments) { console.log(arg); } } // вызов функции sum sum(7, 4, 3, 1);

Funkcija koja ispisuje na konzolu sve argumente koji su joj proslijeđeni i njihov broj:

// funkcija deklaracije funkcije myFunction () ( var i; console.log("Broj proslijeđenih parametara = " + arguments.length); // ponavljanje svih parametara koristeći for petlju for (i = 0; i< arguments.length; i++) { console.log(i + " параметр = " + arguments[i]); } } // вызовы функции myFunction myFunction(3, 7, 27, "JavaScript"); myFunction(); myFunction("Яблоки", "Груши", "Апельсины");

Funkcija koja obavlja sabiranje svih argumenata koji su joj proslijeđeni (njihov broj nije poznat unaprijed):

// deklaracija funkcije var myCalc = function() ( // ponavljanje svih parametara koristeći for petlju var i, sum = 0; for (i = 0; i lt; arguments.length; i++) ( sum += arguments[i ] ; ) // vraća zbroj kao rezultat vraća zbroj; ) // poziv funkcije (izlaz na konzolu) console.log(myCalc(4, 20, 17, -6));

Kao rezultat, objekt argumenata može se implementirati u tijelo funkcije:

  • provjera broja proslijeđenih argumenata;
  • obrada bilo kojeg broja parametara.

Osim same funkcije, druge funkcije koje se nalaze u njoj također imaju pristup argumentima koji joj se prosljeđuju tokom faze poziva.

Funkcija mainF(p1, p2) ( funkcija childF() ( console.log("p1 = " + p1 + "; p2 = " + p2); ) childF(); ) mainF(3, 5); // p1 = 3; p2 = 5 mainF(4, 7); // p1 = 4; p2 = 7

Zadana vrijednost parametra

Počevši od ECMAScript 2015 (6) parametar funkcije možete postaviti vrijednost koju će imati po defaultu.

Na primjer, postavimo parametar "color" na njegovu zadanu vrijednost "#009688":

Funkcija setBGColor(color = "#009688") (document.body.style.backgroundColor = color; ) setBGColor(); // boja pozadine će biti #009688 setBGColor("red"); // boja pozadine će biti crvena

Prije ECMAScript 2015, mogli ste postaviti parametar na zadanu vrijednost, na primjer, to je bilo ovako:

Funkcija setBGColor(color) ( boja = boja !== undefined ? boja: "#009688"; // postavlja boju na zadanu vrijednost "#009688" document.body.style.backgroundColor = boja; )

Preostali parametri

Ako joj pri pozivanju funkcije proslijedite više argumenata nego što ima parametara, onda preostale možete dobiti pomoću tzv. preostali parametri (patametri odmora). Ova funkcija se pojavila u jeziku od ECMAScript 2015.

// ...nums su preostali parametri, kojima se u ovom slučaju može pristupiti imenom nums function doMath(mathAction, ...nums) ( var rezultat = 0; nums.forEach(function(value) (switch ( mathAction) ( slučaj "suma": rezultat += vrijednost; prekid; slučaj "sumCube": rezultat += vrijednost**3; prekid; slučaj "sumSquare": rezultat += vrijednost**2; prekid; zadano: rezultat = 0 ; ) ) ) vrati rezultat; ) console.log(doMath("sum", 3, 4, 21, -4)); // 24 (3 + 4 + 21 + (-4)) console.log(doMath("sumSquare", 1, 4)); // 17 (1^2 + 4^2) console.log(doMath("sumCube", 3, 2, 4)); // 99 (3^3 + 2^3 + 4^3)

povratna izjava

Naredba return ima za cilj da vrati vrijednost ili rezultat evaluacije izraza trenutne funkcije. Vrijednost ili izraz mora biti odvojen od povrata razmakom. Osim toga, naredba return prekida izvršavanje funkcije, tj. sve instrukcije koje slijede neće biti izvršene.

Funkcija u JavaScript-u uvijek vraća rezultat, bez obzira da li se izraz return koristi ili ne.

// funkcija vraćanja funkcije sayWelcome (userFirstName, userLastName) (if ((!userFirstName) || (!userLastName)) vraća "Dobrodošao, anonimni korisnik"; inače vraća "Dobrodošli, " + userLastName + " " + userFirstName ; ) // deklaracija varijable person var person; // dodijeli rezultat funkcije sayWelcome promjenljivoj osobi person = sayWelcome("Ivan","Ivanov"); // ispisuje vrijednost varijable na konzoli console.log(person); //Instrukcija koja će ispisati na konzolu rezultat funkcije sayWelcome console.log(sayWelcome("Peter","Petrov")); //Instrukcija koja će na konzolu izvesti rezultat funkcije sayWelcome console.log(sayWelcome("Sidorov")); JavaScript - funkcija s provjerom valjanosti parametara

Funkcija u JavaScript-u uvijek vraća rezultat kao rezultat svog izvršenja, čak i ako nije eksplicitno definirana pomoću naredbe return. Ovaj rezultat je nedefinisan.

// 1. funkcija koja ne vraća nikakvu rezultatsku funkciju sayWelcome (userFirstName, userLastName) ( console.log("Welcome, " + userLastName + " " + userFirstName); ) // pokušajte dobiti rezultat iz funkcije koja to čini ne vraća ništa console .log(sayWelcome ("Ivan", "Ivanov")); // 2. funkcija koja sadrži izraz return bez funkcije vrijednosti sayDay (dan) ( day = "Danas, " + dan; return; //ova izjava neće biti izvršena jer dolazi nakon povratne izjave console.log(day ) ; ) // pokušavamo dobiti rezultat funkcije koja sadrži izraz return bez vrijednosti console.log(sayDay("21. februar 2016.")); JavaScript - Dobijte vrijednost iz funkcije koja ništa ne vraća

Isti rezultat će se dobiti ako povratna vrijednost nije specificirana za izraz return.

Preopterećenje funkcije u JavaScript-u

Preopterećenje funkcija u programiranju je mogućnost deklariranja više funkcija s istim imenom u istom opsegu. Takve se funkcije razlikuju jedna od druge po vrsti i broju argumenata. Svaka funkcija ima svoju logiku programiranja. Preopterećenje funkcije se koristi tako da se slične radnje mogu izvesti pomoću istog imena funkcije.

Jezik JavaScript ne podržava preopterećenje funkcija na način na koji se implementira, na primjer, u jezicima sličnim C. One. u JavaScriptu, ne možete kreirati više funkcija sa istim imenom koje su u istom opsegu.

Slična funkcionalnost se može implementirati u JavaScript koristeći sljedeće korake:

  • Da biste provjerili da li je argument proslijeđen ili ne, koristite uvjet s provjerom njegove vrijednosti za undefined.
  • Da biste provjerili broj argumenata proslijeđenih funkciji, koristite svojstvo dužine argumenata objekta.
  • Da biste saznali tip proslijeđene vrijednosti argumenta, koristite operatore typeof ili instanceof.
  • Za rad s promjenjivim brojem argumenata, koristite objekt arguments.
  • Počevši od ECMAScript6, možete odrediti zadane vrijednosti za argumente.

Na primjer, napravimo funkciju koja se može pozvati s jednim ili dva argumenta:

//deklariranje funkcije koja mijenja boju pozadine elemenata funkcija setBgColor(bgColor,elements) ( //ako parametar elemenata nije specificiran prilikom pozivanja if (elements=== undefined) ( //tada postavite njegovu vrijednost na "div" elements = "div "; ) // dobijemo sve elemente elemente = $(elements); // prođemo kroz sve elemente i postavimo ih na navedene elemente boje pozadine. each(function()( $(this).css("background -color",bgColor) ; )); ) /*Pozovite setBgColor funkciju sa jednim parametrom. Jer 2 parametar nije naveden, onda će ova funkcija promijeniti boju pozadine svih div elemenata.*/ setBgColor("green"); /*Pozovite setBgColor funkciju sa 2 parametra. Jer 2 je postavljen parametar, tada će ova funkcija promijeniti boju pozadine samo elemenata gumba.*/ setBgColor("#ff0000","button");

Učinimo neke promjene u gornjem kodu. Naime, za drugi parametar navodimo zadanu vrijednost:

//deklariranje funkcije koja mijenja boju pozadine elemenata //parametar elemenata je postavljen na "div" prema zadanoj funkciji setBgColor(bgColor,elements = "div") ( //dobiti sve elemente elemente = $(elements); / /iterirajte sve elemente i postavite im specificiranu boju pozadine elements.each(function()( $(this).css("background-color",bgColor); )); ) //pozovite setBgColor funkciju, specificirajući jedan parametar setBgColor("zeleno"); //pozovite funkciju setBgColor, specificirajući 2 parametra setBgColor("#ff0000","button");

Primjer kako implementirati "preopterećenu" funkciju u JavaScript-u koja izračunava broj kalorija koje osoba treba dnevno:

// opis funkcije funkcija countCal(sex, visina) ( // parametri: spol (spol) i visina (visina) var rezultat; if ((sex === 0) || (sex === "muškarac")) ( rezultat = (visina - 100) * 20; ) inače if ((spol === 1) || (spol === "žena")) ( rezultat = (visina - 105) * 19; ) if (rezultat) ( // argumenti - nivo aktivnosti if (argumenti) ( rezultat *= argumenti; ) console.log("Broj kalorija za normalan život: " + rezultat); ) else ( console.log("Nevažeći parametri"); ) ) / * pozivanje funkcije i prosljeđivanje 2 argumenta (1 - "man", može se pristupiti s imenom sex i argumentima; 2 - vrijednosti 185, može se pristupiti s imenom sex i argumentima) */ countCal("man", 185); /* poziva funkciju i prosljeđuje joj 3 parametra, iako su samo 2 prisutna u opisu funkcije (u ovom slučaju vrijednost 3 parametra možete dobiti samo kao argumente) */ countCal(0, 185, 2);

rekurzija

Rekurzija je poziv samoj sebi unutar tijela neke funkcije.

Poziv funkcije se obično vrši ovisno o načinu na koji je deklarirana imenom ili kroz varijablu koja sadrži referencu na ovu funkciju.

Funkcija fact(n) ( if (n === 1) ( return 1; ) return fact(n-1) * n; ) console.log(fact(5)); // 120

Funkciju unutar njenog tijela možete pozvati ne samo imenom, već i korištenjem svojstva callee objekta argumenata. Ali bolje je ne koristiti ovu imovinu, jer. to je zastarjelo. Osim toga, uopće ne radi u strogom načinu rada.

Šta su ugrađene (standardne) funkcije?

JavaScript ima ogroman skup ugrađenih (standardnih) funkcija. Ove funkcije su već opisane u samom pretraživaču. Gotovo svi su metode jednog ili drugog objekta.

Na primjer, da biste pozvali ugrađenu funkciju (metodu) upozorenje, ne mora se prethodno deklarirati. Već je opisano u pretraživaču. Metoda upozorenja se poziva navođenjem imena, zagrada i argumenta unutar njih. Ova metoda je dizajnirana da prikaže poruku na ekranu u obliku dijaloškog okvira. Tekstualna poruka se uzima iz vrijednosti parametra ove funkcije.

// pozivamo funkciju alert alert("Neki tekst"); JavaScript - Pozivanje funkcije upozorenja

Funkcije su ključni koncept u JavaScript-u. Najvažnija karakteristika jezika je prvoklasna podrška za funkcije (funkcionira kao građanin prvog reda). Bilo koji funkcija je objekt, i stoga se njime može manipulirati kao objektom, posebno:

  • proslijediti kao argument i vratiti kao rezultat prilikom pozivanja drugih funkcija (funkcije višeg reda);
  • kreirajte anonimno i dodijelite kao vrijednosti varijablama ili svojstvima objekata.

Ovo određuje visoku izražajnu moć JavaScript-a i omogućava mu da se klasifikuje kao jezik koji implementira paradigmu funkcionalnog programiranja (što je samo po sebi vrlo cool iz mnogo razloga).

Funkcija u JavaScript-u posebna vrsta objekata koji vam omogućavaju da formalizirate određenu logiku ponašanja i obrade podataka pomoću jezika.

Da biste razumjeli kako funkcije funkcioniraju, potrebno je (i dovoljno?) imati ideju o sljedećim točkama:

Deklaracija funkcije

Funkcije oblika "izjava deklaracije funkcije"

Deklaracija funkcije ( definicija funkcije, ili deklaracija funkcije, ili izraz funkcije) sastoji se od ključne riječi funkcije i sljedećih dijelova:

  • Naziv funkcije.
  • Lista parametara (uzimanih od strane funkcije) zatvorenih u zagradama () i odvojenih zarezima.
  • Instrukcije koje će se izvršiti nakon poziva funkcije zatvorene su u vitičaste zagrade ( ).

Na primjer, sljedeći kod deklarira jednostavnu funkciju pod nazivom kvadrat:

funkcija kvadrat(broj) (povratni broj * broj;)

Funkcija kvadrat uzima jedan parametar, nazvan broj. Sastoji se od jedne instrukcije, što znači vratiti parametar ove funkcije (to je broj) pomnožen sam sa sobom. Naredba return specificira vrijednost koju će funkcija vratiti.

povratni broj * broj;

Primitivni parametri (kao što je broj) se prosljeđuju funkciji po vrijednosti; značenje se prosljeđuje funkciji, ali ako funkcija promijeni vrijednost parametra, ova promjena se neće odraziti globalno ili nakon poziva funkcije.

Ako proslijedite objekt kao parametar (ne primitivan, na primjer, ili korisnički definirane objekte) i funkcija promijeni svojstvo objekta koji joj je proslijeđen, ta promjena će biti vidljiva izvan funkcije, kao što je prikazano u sljedećem primjeru :

Funkcija myFunc(theObject) ( theObject.make = "Toyota"; ) var mycar = (marka: "Honda", model: "Accord", godina: 1998); var x, y; x = mycar.make; // x dobiva vrijednost "Honda" myFunc(mycar); y=mycar.make; // y je postavljen na "Toyota" // (svojstvo je promijenjeno funkcijom)

Funkcije oblika "izraz definicije funkcije"

Funkcija oblika "izjava deklaracije funkcije" je, u sintaksi, izjava ( izjava), druga funkcija može biti u obliku "izraz definicije funkcije". Takva funkcija može biti anoniman(ona nema ime). Na primjer, kvadratna funkcija se može pozvati ovako:

Var kvadrat = funkcija(broj) (povratni broj * broj; ); var x = kvadrat(4); // x dobiva vrijednost 16

Međutim, ime se također može dodijeliti za pozivanje samog sebe unutar same funkcije i za debugger ( debugger) za identifikaciju funkcije u stackovima steka ( tragovi steka; "trag" - "trag" / "otisak").

Var faktorijal = funkcija fac(n) (vrati n< 2 ? 1: n * fac(n - 1); }; console.log(factorial(3));

Funkcije oblika "izraz definicije funkcije" su zgodne kada se funkcija prosljeđuje kao argument drugoj funkciji. Sljedeći primjer pokazuje funkciju mape koja treba uzeti funkciju kao svoj prvi argument i niz kao svoj drugi.

Funkcija map(f, a) ( var result = , // Kreirajte novi niz i; za (i = 0; i != a.length; i++) result[i] = f(a[i]); vrati rezultat ;)

U sljedećem kodu, naša funkcija uzima funkciju koja je izraz definicije funkcije i izvršava je za svaki element primljenog niza kao drugi argument.

Funkcija map(f, a) ( var result = ; // Kreirajte novi niz var i; // Deklarirajte varijablu za (i = 0; i != a.length; i++) result[i] = f(a[i ]); vrati rezultat; ) var f = funkcija(x) (vrat x * x * x; ) var numbers = ; var kocka = map(f,brojevi); dnevnik konzole (kocka);

Funkcija vraća: .

U JavaScript-u, funkcija se može deklarirati sa uslovom. Na primjer, sljedeća funkcija će biti dodijeljena myFunc samo ako je broj 0:

Var myFunc; if (num === 0) ( myFunc = function(theObject) (theObject.make = "Toyota"; ) )

Osim ovdje opisanih deklaracija funkcija, možete koristiti i konstruktor funkcije za kreiranje funkcija iz niza u vremenu izvođenja ( vrijeme izvođenja), kao .

Metoda je funkcija koja je svojstvo objekta. Više o objektima i metodama možete saznati na linku: Rad sa objektima.

Pozivi funkcija

Deklaracija funkcije je ne izvršava. Deklaracija funkcije jednostavno imenuje funkciju i specificira šta treba učiniti kada se funkcija pozove. Zovi funkcija zapravo izvodi navedene radnje sa navedenim parametrima. Na primjer, ako definirate kvadratnu funkciju, možete je pozvati ovako:

Kvadrat(5);

Ova instrukcija poziva funkciju s argumentom 5. Funkcija poziva njene instrukcije i vraća vrijednost 25.

Funkcije mogu biti u opsegu kada su već definirane, ali funkcije oblika "izjava deklaracije funkcije" mogu biti podignute ( podizanje - podizanje), baš kao u ovom primjeru:

Console.log(kvadrat(5)); /* ... */ funkcija square(n) (vrati n * n; )

Opseg funkcije je funkcija u kojoj je definirana, ili cijeli program ako je deklarirana na višoj razini.

Bilješka: Ovo radi samo kada deklaracija funkcije koristi gornju sintaksu (tj. FuncName()()). Kod ispod neće raditi. To znači da podizanje funkcije radi samo s deklaracijom funkcije i ne radi s izrazom funkcije.

Console.log(kvadrat); // kvadrat se podiže s nedefiniranom vrijednošću. console.log(kvadrat(5)); // TypeError: square nije funkcija var square = function(n) (vraćanje n * n; )

Argumenti funkcije nisu ograničeni na nizove i brojeve. Možete proslijediti cijele objekte funkciji. Funkcija show_props() (deklarirana u Radu s objektima) je primjer funkcije koja uzima objekte kao argument.

Funkcija može pozvati samu sebe. Na primjer, ovdje je rekurzivna faktorijalna funkcija:

Funkcija factorial(n) (ako ((n === 0) || (n === 1)) vrati 1; inače vrati (n * factorial(n - 1)); )

Tada možete izračunati faktorijele od jedan do pet ovako:

Var a, b, c, d, e; a = faktorijel(1); // a dobiva vrijednost 1 b = factorial(2); // b dobiva vrijednost 2 c = factorial(3); // c dobiva vrijednost 6 d = factorial(4); // d dobiva vrijednost 24 e = factorial(5); // e dobiva vrijednost 120

Postoje i drugi načini za pozivanje funkcije. Česti su slučajevi kada funkcije treba pozvati dinamički, ili treba promijeniti brojeve argumenata funkcije, ili funkciju treba pozvati sa vezanjem za određeni kontekst. Ispostavilo se da su same funkcije objekti, a ti objekti zauzvrat imaju metode (vidi objekt). Jedna od njih je metoda čijom se upotrebom može postići ovaj cilj.

Opseg funkcije

(opseg funkcije)

Varijablama deklariranim u funkciji ne može se pristupiti bilo gdje izvan te funkcije, tako da se varijable (koje su potrebne posebno za funkciju) deklariraju samo u opsegu funkcije. U ovom slučaju, funkcija ima pristup svim varijablama i funkcijama deklariranim unutar njenog djelokruga. Drugim riječima, funkcija deklarirana u globalnom opsegu ima pristup svim varijablama u globalnom opsegu. Funkcija deklarirana unutar druge funkcije i dalje ima pristup svim varijablama svoje roditeljske funkcije i drugim varijablama kojima ova roditeljska funkcija ima pristup.

// Sljedeće varijable su deklarirane u globalnom opsegu var num1 = 20, num2 = 3, name = "Chamahk"; // Ova funkcija je deklarirana u funkciji globalnog opsega multiply() ( return num1 * num2; ) multiply(); // vraća 60 // Funkcija primjer ugniježđene funkcije getScore() ( var num1 = 2, num2 = 3; funkcija add() ( povratno ime + " postignuto " + (num1 + num2); ) return add(); ) getScore( ); // vraća "Chamahk postigao 5"

Funkcije opsega i steka

(stog funkcija)

rekurzija

Funkcija može pozvati samu sebe. Tri načina da ga nazovete:

  1. po imenu funkcije
  2. pomoću varijable koja se odnosi na funkciju

Na primjer, razmotrite sljedeću funkciju:

Var foo = function bar() ( // naredbe idu ovdje);

Unutar funkcije ( funkcionalno tijelo) svi sljedeći pozivi su ekvivalentni:

  1. bar()
  2. arguments.callee()
  3. foo()

Poziva se funkcija koja sama sebe poziva rekurzivna funkcija (rekurzivna funkcija). Ispostavilo se da je rekurzija slična petlji ( petlja). Oba pozivaju neki kod više puta, i oba zahtijevaju uvjet (da bi se izbjegla beskonačna petlja, odnosno beskonačna rekurzija). Na primjer, sljedeća petlja:

Var x = 0; dok (x< 10) { // "x < 10" - это условие для цикла // do stuff x++; }

može se promijeniti u rekurzivnu funkciju i pozvati ovu funkciju:

Funkcija loop(x) (ako je (x >= 10) // "x >= 10" je krajnji uslov (isto kao "!(x)< 10)") return; // делать что-то loop(x + 1); // рекурсионный вызов } loop(0);

Međutim, neki algoritmi ne mogu biti jednostavne petlje koje se ponavljaju. Na primjer, dobivanje svih elemenata strukture stabla (na primjer, ) najlakše je implementirati pomoću rekurzije:

Funkcija walkTree(čvor) (if (čvor == null) // povratak; // uradi nešto s elementima za (var i = 0; i< node.childNodes.length; i++) { walkTree(node.childNodes[i]); } }

U poređenju sa funkcijom petlje, svaki rekurzivni poziv sam po sebi uzrokuje mnogo rekurzivnih poziva.

Također je moguće učiniti neke rekurzivne algoritme nerekurzivnim, ali često je njihova logika vrlo složena i zahtijeva korištenje steka ( stog). U stvari, rekurzija koristi stach: stog funkcija.

Ponašanje steka može se vidjeti u sljedećem primjeru:

Funkcija foo(i) (ako je (i< 0) return; console.log("begin: " + i); foo(i - 1); console.log("end: " + i); } foo(3); // Output: // begin: 3 // begin: 2 // begin: 1 // begin: 0 // end: 0 // end: 1 // end: 2 // end: 3

Ugniježđene funkcije i zatvaranja

Možete ugnijezditi jednu funkciju u drugu. ugniježđena funkcija ( ugniježđena funkcija;unutrašnji) privatni ( privatni) i nalazi se u drugoj funkciji ( vanjski). Ovako se formira zatvaranje (zatvaranje). Zatvaranje je izraz (obično funkcija) koji može imati slobodne varijable zajedno sa okruženjem koje povezuje te varijable (koje se "zatvara" ( zatvori) izraz).

Budući da je ugniježđena funkcija zatvaranje, to znači da ugniježđena funkcija može "naslijediti" ( nasljediti) argumente i varijable funkcije u kojoj je ugniježđen. Drugim riječima, ugniježđena funkcija sadrži opseg vanjskog ( "spoljašnji") funkcije.

rezimirati:

  • Ugniježđena funkcija ima pristup svim uputama vanjske funkcije.
  • Ugniježđena funkcija formira zatvaranje: može koristiti argumente i varijable vanjske funkcije, dok vanjska funkcija ne može koristiti argumente i varijable ugniježđene funkcije.

Sljedeći primjer pokazuje ugniježđenu funkciju:

Funkcija addSquares(a, b) ( funkcija square(x) ( return x * x; ) return square(a) + square(b); ) a = addSquares(2, 3); // vraća 13 b = addSquares(3, 4); // vraća 25 c = addSquares(4, 5); // vraća 41

Budući da ugniježđena funkcija formira zatvaranje, možete pozvati vanjsku funkciju i dati argumente za obje funkcije (za vanjsku i unutarnju).

Funkcija izvan (x) ( funkcija unutar (y) ( povratak x + y; ) povratak unutra; ) fn_inside = izvan (3); // Razmislite o tome: dajte mi funkciju da // prenesem 3 rezultat = fn_inside(5); // vraća 8 rezultat1 = outside(3)(5); // vraća 8

Čuvanje varijabli

Imajte na umu da je vrijednost x sačuvana kada je unutra vraćeno. Zatvaranje mora sačuvati argumente i varijable u cijelom opsegu. Budući da svaki poziv pruža potencijalno različite argumente, kreira se novo zatvaranje za svaki poziv prema van. Memorija se može obrisati samo kada se unutra već vratila i više nije dostupna.

Ovo se ne razlikuje od pohranjivanja referenci u druge objekte, ali je često manje očigledno jer reference nisu postavljene direktno i ne mogu se tamo potražiti.

Više nivoa ugniježđenja funkcija (višestruko ugniježđene funkcije)

Funkcije se mogu ubaciti nekoliko puta, tj. funkcija (A) pohranjuje funkciju (B) koja pohranjuje funkciju (C) u sebi. Obje funkcije B i C formiraju zatvaranja, tako da B ima pristup varijablama i argumentima A, a C ima isti pristup B. Osim toga, pošto C ima pristup B koji ima isti pristup A, C također ima takav pristup isti pristup A. Dakle, cloures može pohraniti nekoliko opsega; oni rekurzivno pohranjuju opseg funkcija koje ga sadrže. To se zove ulančavanje (lanac - lanac; Zašto se to zove "lančavanje" biće objašnjeno kasnije)

Razmotrite sljedeći primjer:

Funkcija A(x) ( funkcija B(y) ( funkcija C(z) ( console.log(x + y + z); ) C(3); ) B(2); ) A(1); // konzola će prikazati 6 (1 + 2 + 3)

U ovom primjeru, C ima pristup y funkcije B i x funkcije A. Ovo se dešava jer:

  1. Funkcija B formira zatvaranje koje uključuje A, tj. B ima pristup argumentima i varijablama funkcije A.
  2. Funkcija C formira zatvaranje koje uključuje B.
  3. Pošto zatvaranje funkcije B uključuje A, onda zatvaranje C također uključuje A, C ima pristup argumentima i varijablama obje funkcije B i A. Drugim riječima, C povezuje lanac (lanac) opsega funkcija B i A, tim redoslijedom.

Obrnuto, međutim, nije tačno. A nema pristup C-ovim varijablama i argumentima jer A nema takav pristup B. Dakle, C ostaje privatan samo za B.

Sukobi imena

Kada dva argumenta ili varijable u opsegu zatvaranja imaju isto ime, sukob imena (sukob imena). Više ugniježđeno ( više unutrašnje) opseg ima prednost, tako da ugniježđeni opseg ima najveći prioritet, i obrnuto. Ovo je lanac opsega ( lanac opsega). Prva karika je najdublji opseg, i obrnuto. Uzmite u obzir sljedeće:

Funkcija izvan () ( var x = 5; funkcija unutar (x) ( return x * 2; ) return unutra; ) izvan () (10); // vraća 20 umjesto 10

Došlo je do sukoba imena u izrazu return x * 2 između x parametra unutrašnje funkcije i varijable x vanjske funkcije. Lanac opsega će ovdje biti ovako: ( unutar ==> izvan ==> globalnog objekta ( globalni objekat)). Prema tome, x unutar ima prednost nad vanjskim i vraćamo 20 (= 10 * 2) umjesto 10 (= 5 * 2).

Zatvaranja

(zatvaranja)

Zatvaranja su jedna od glavnih karakteristika JavaScript-a. JavaScript dozvoljava ugniježđenje funkcija i daje ugniježđenoj funkciji potpun pristup svim varijablama i funkcijama deklariranim unutar vanjske funkcije (i drugim varijablama i funkcijama kojima vanjska funkcija ima pristup).

Međutim, vanjska funkcija nema pristup varijablama i funkcijama deklariranim u unutarnjoj funkciji. Ovo pruža neku vrstu enkapsulacije za varijable unutar ugniježđene funkcije.

Također, budući da ugniježđena funkcija ima pristup opsegu vanjske funkcije, varijable i funkcije deklarirane u vanjskoj funkciji nastavit će postojati nakon njenog izvršenja za ugniježđenu funkciju, ako je pristup sačuvan na njima i na njoj (što znači da varijable deklarirane u vanjskim funkcijama se zadržavaju samo ako ih unutrašnja funkcija poziva).

Zatvaranje se stvara kada ugniježđena funkcija nekako postane dostupna u nekom opsegu izvan vanjske funkcije.

Var pet = function(name) ( // Vanjska funkcija je deklarirala varijablu "name" var getName = function() ( povratno ime; // Ugniježđena funkcija ima pristup "name" vanjske funkcije ) return getName; / / Vraća ugniježđenu funkciju, tako da zadržite pristup // njoj za drugi opseg ) myPet = pet("Vivie"); moj kućni ljubimac(); // Vraća "Vivie", // jer čak i nakon izvršavanja vanjske funkcije // ime je sačuvano za ugniježđenu funkciju

Složeniji primjer je prikazan u nastavku. Objekt s metodama za manipulaciju ugniježđenom funkcijom pomoću vanjske funkcije može se vratiti ( povratak).

Var createPet = function(name) (var sex; return (setName: function(newName) (name = newName; ), getName: function() (povratno ime;), getSex: function() (povratni seks;), setSex: function(newSex) ( if(typeof newSex === "string" && (newSex.toLowerCase() === "muški" || newSex.toLowerCase() === "ženski")) ( sex = newSex; ) ) ) ) var pet = createPet("Vivie"); pet.getName(); // Vivie pet.setName("Oliver"); pet.setSex("muško"); pet.getSex(); // muški pet.getName(); // Oliver

U kodu iznad, varijabla name vanjske funkcije dostupna je ugniježđenoj funkciji i ne postoji drugi način za pristup ugniježđenim varijablama osim putem ugniježđene funkcije. Ugniježđene varijable ugniježđene funkcije su sigurna spremišta za vanjske argumente i varijable. Oni sadrže "konstantne" i "inkapsulirane" podatke za rad ugniježđenih funkcija. Funkcije čak ne moraju biti dodijeljene varijabli ili imaju ime.

Var getCode = (function() ( var apiCode = "0]Eal(eh&2"; // Kod koji ne želimo da stranci mogu modificirati... return function() ( return apiCode; ); )()) ; getCode(); // Vraća apiCode

Međutim, postoji niz zamki kojih morate biti svjesni kada koristite zatvarače. Ako privatna funkcija definira varijablu s istim imenom kao ime varijable u vanjskom opsegu, ne postoji način da se ponovo referencira varijabla u vanjskom opsegu.

Var createPet = function(name) ( // Vanjska funkcija definira varijablu pod nazivom "name". return ( setName: function(name) ( // Priložena funkcija također definira varijablu pod nazivom "name". name = name; // Kako pristupiti "imenu" definiranom vanjskom funkcijom? ) ) )

Korištenje objekta arguments

Objekt argumenta funkcije je pseudo-niz. Unutar funkcije možete se pozivati ​​na argumente poput ovoga:

Argumenti[i]

gdje je i indeksni broj argumenta, počevši od 0. Prvom argumentu proslijeđenom funkciji pristupa se kao argumentima. I da dobijete broj svih argumenata - arguments.length .

Sa objektom arguments, možete pozvati funkciju tako što ćete joj proslijediti više argumenata nego što ste formalno deklarirali da prihvaćate. Ovo je vrlo korisno ako ne znate tačno koliko argumenata vaša funkcija treba da uzme. Možete koristiti arguments.length da odredite broj argumenata proslijeđenih funkciji, a zatim pristupite svakom argumentu koristeći objekt arguments.

Na primjer, razmotrite funkciju koja spaja više stringova. Jedini formalni argument funkcije bit će string koji specificira znakove koji razdvajaju elemente za spajanje. Funkcija je definirana ovako:

Funkcija myConcat(separator) ( var result = ""; var i; // ponavljanje kroz argumente za (i = 1; i< arguments.length; i++) { result += arguments[i] + separator; } return result; }

Možete proslijediti bilo koji broj argumenata ovoj funkciji i ona će spojiti svaki argument u jedan string.

// vraća "crveno, narandžasto, plavo, " myConcat(", ", "crveno", "narandžasto", "plavo"); // vraća "elephant; žirafa; lav; gepard; " myConcat("; ", "elephant", "giraffe", "lion", "cheetah"); // vraća "žadulja. bosiljak. origano. biber. peršin. " myConcat(". ", "žadulja", "bosiljak", "origano", "biber", "peršin");

Jer arguments je pseudo-niz, na njega se primjenjuju neke metode niza, kao što je za .. u

Funkcija func() ( for (vrijednost u argumentima)( console.log(value); ) ) func(1, 2, 3); // 1 // 2 // 3

Bilješka: arguments je pseudo-niz, ali ne i niz. Ovo je pseudo-niz koji ima numerisane indekse i svojstvo dužine. Međutim, nema sve metode niza.

Parametri mirovanja

Na uvođenje funkcija strelice utjecala su dva faktora: kraće funkcije i leksikon ove .

Kraće funkcije

Neki obrasci funkcija potiču upotrebu kraćih funkcija. uporedi:

Var a = [ "Vodik", "Helijum", "Litijum", "Berilijum" ]; var a2 = a.map(funkcija(e) (vraćanje s.dužine; )); dnevnik konzole(a2); // zapisi var a3 = a.map(s => s.length); dnevnik konzole (a3); // logs

Rečnik ovo

Prije funkcija sa strelicama, svaka nova funkcija definirala je svoju vlastitu vrijednost (novi objekt u slučaju konstruktora, nedefiniran u strogom načinu rada, objekt konteksta ako se funkcija poziva kao metoda na objektu, itd.). Ovo se pokazalo neugodnim u smislu objektno orijentisanog stila programiranja.

Funkcija Person() ( // Konstruktor Person() definira `ovo` kao sebe. this.age = 0; setInterval(function growUp() ( // Bez strogog načina rada, growUp() definira `ovo` kao globalni objekt, koji se razlikuje od `this` // definiran od strane konstruktora Person().this.age++; ), 1000); ) var p = new Person();

U ECMAScript 3/5, ovaj problem je riješen dodjeljivanjem vrijednosti this varijabli koja se može zatvoriti.

Funkcija Person() ( var self = this; // Neki biraju `to` umjesto `self`. // Odaberite jednu i budite dosljedni. self.age = 0; setInterval(function growUp() ( // Povratni poziv se odnosi na varijabla `self` čija je // vrijednost očekivani object.self.age++; ), 1000); )

Pogledajte i Funkcija u JavaScript Reference za više informacija o funkcijama kao objektu.

Svaki programer dobro zna koje su funkcije i zašto su potrebne. Međutim, funkcije u jeziku Javascript imaju neke posebnosti. Ako već dugo programirate na ovom jeziku, vjerovatno znate da postoje različiti . Ako ste došli s drugog jezika, onda ste čitajući neke članke najvjerovatnije vidjeli ovu, na prvi pogled čudnu, deklaraciju funkcije:

Var add = function(arg1, arg2) (var sum = arg1 + arg2; return sum; ) var result = add(5, 2); //rezultat je sada 7

To jest, funkcija, prvo, nema ime. Drugo, dodeljuje se promenljivoj, ali ne samo da se dodeljuje, već njeno telo odmah ide. Lično, za mene, koji sam ranije pisao na jezicima kao što su VB, C++, ovakva najava izazvala je zbunjenost i nerazumijevanje kako to funkcionira i zašto uopće tako pisati.

Navikao sam na deklaraciju i poziv "klasične" funkcije, ovako:

Funkcija add(arg1, arg2) ( var sum = arg1 + arg2; return sum; ) var rezultat = add(5, 3); //rezultat je sada 8

I tu dolazimo do karakteristika funkcija u Javascriptu. Radi lakšeg razumijevanja, zamislite da je funkcija u JS-u obična vrijednost, kao što je broj ili niz. Možete upisati broj 5 u varijablu rezultata, zar ne? Ili nešto složenije, poput niza, a zatim ga prikazati na ekranu? Možeš. Dakle, ako zamislimo da je funkcija obična vrijednost, iako vrlo složena struktura, onda prvi način deklariranja više ne izgleda kao nešto nevjerovatno.

Sljedeća zanimljivost je logičan nastavak prve. Nakon što stavimo podatke u varijablu, možemo proslijediti podatke drugoj varijabli koristeći ime ove varijable:

Var a = 5; var b = a; upozorenje(b); // izlazi 5

Uobičajena stvar. Sada pogledajte ovaj kod:

Var add = function(arg1, arg2) (var sum = arg1 + arg2; return sum; ) var calcSum = add; upozorenje(zbroj izračuna(5, 6)); // izlazi 11

Počinješ li nagađati? Budući da je funkcija poput varijable, možemo je "propagirati" uobičajenim dodjeljivanjem drugim varijablama, pretvarajući ih također u funkcije. Sada calcSum takođe može sabirati dva broja. Međutim, kod

VarcalcSum = add(1, 1); //calcSum je sada jednak 2, ovo nije funkcija, već varijabla sa brojem alert(calcSum(5, 6)); //greška

Neće se izvršiti, jer u prvom redu nismo dodijelili samu funkciju, već rezultat njenog izvršenja (zagrade označavaju da se funkcija treba izvršiti, a ne dodijeliti).

Ako trebate pozvati funkciju na sebi, onda se to radi na sljedeći način:

Var calcFact = funkcija fact(val) ( if (val == 1) ? val: val * fact(val - 1); // izračunaj faktorijal korištenjem rekurzije ) alert(calcFact(4)); // izlazi 24

Ovdje, dodjeljivanjem funkcije varijabli, dali smo joj ime fact. Međutim, ovo ime će biti dostupno samo unutar same funkcije i nigdje drugdje. Razlozi za to leže u principu tumača i izvan su okvira lekcije.

Možda se pitate: "Hm, zanimljiva funkcija! Ali koja je prednost ovog rada? Postoje li situacije u kojima je to neizbježno, ili barem zgodnije od obične deklaracije?". Neću tvrditi da postoje situacije u kojima je nemoguće bez takvog pristupa, ali mogu navesti primjer gdje se smanjuje količina koda. Recimo da trebate pozdraviti osobu u zavisnosti od doba dana:

Var datum = novi datum(); var hello = (date.getHours()< 12) ? function() {alert("Доброе утро!")} : (date.getHours() < 18) ? function() {alert("Добрый день!")} : function() {alert("Добрый вечер!")}; hello();

Kao što vidite, funkcije su izuzetno jednostavne, sa jednom komandom za upozorenje.

Ako bismo odlučili da idemo "klasičnim" putem, onda bismo morali napisati tri odvojene funkcije, a zatim ih pozvati u uslovu vremenskog testa:

Funkcija goodMorning() ( alert("Dobro jutro!"); ) funkcija goodAfternoon() ( alert("Dobar dan!"); ) funkcija goodEvning() ( alert("Dobro veče!"); ) var date = new Date (); (datum.getHours()< 12) ? goodMorning() : (date.getHours() < 18) ? goodAfternoon() : goodEvning();

Kôd je značajno narastao vizualno, iako smo koristili kratku formu uvjetnog iskaza. Ako pretpostavimo da datoteka sadrži zaista važne funkcije koje obavljaju proračune, onda zagađivanje liste takvim mini funkcijama koje nemaju važnu logiku, a koje se najvjerovatnije koriste samo jednom, nije dobra ideja. Osim toga, primorani smo svakoj funkciji dati jedinstveno ime i specificirati ga prilikom poziva. Stoga, ako trebate promijeniti ime jednog od njih, morat ćete ga promijeniti na dva mjesta, što povećava vjerovatnoću greške.

Drugo, ako koristimo "klasičnu" metodu, gubimo mogućnost dodjeljivanja funkcije varijabli. Odnosno, pišite

Funkcija add(a, b) ( return a + b; ) var calcSum = add; calcSum(5, 5);

Već nemoguće. Stoga, u našem primjeru, ako i dalje trebamo pozdraviti gosta više puta, morat ćemo svaki put duplicirati ovaj fragment:

(datum.getHours()< 12) ? goodMorning() : (date.getHours() < 18) ? goodAfternoon() : goodEvning();

A u prvom slučaju biće dovoljno samo napisati hello(); a rezultat će biti isti.

Rekao sam vam o zanimljivoj osobini JS funkcija i dao primjere. Tako ste to videli načine pozivanja funkcija u Javascriptu nisu ograničeni na jednu vrstu. Čak i ako ne možete odmah pronaći upotrebu ovih karakteristika u svojim projektima, barem ćete znati da takve karakteristike postoje. A kada se ukaže zaista dobra prilika, možete smanjiti količinu koda i izbjeći nepotrebnu zabunu i greške.!

Ovaj članak opisuje Javascript funkcije na nivou jezika: kreiranje, opcije, trikovi, zatvaranja i još mnogo toga.

Kreiranje funkcija

Postoje 3 načina za kreiranje funkcije. Glavna razlika kao rezultat njihovog rada je ta što je imenovana funkcija vidljiva svuda, a anonimna tek nakon deklaracije:

Funkcije - Objekti

U javascriptu, funkcije su punopravni objekti ugrađene klase Function. Zbog toga se mogu dodijeliti varijablama, proslijediti i, naravno, imaju svojstva:

Funkcija f() ( ... ) f.test = 6 ... alert(f.test) // 6

Svojstva funkcije su također dostupna unutar funkcije, tako da se mogu koristiti kao statičke varijable.

Na primjer,

Funkcija func() ( var funcObj = arguments.callee funcObj.test++ alert(funcObj.test) ) func.test = 1 func() func()

Na početku rada, svaka funkcija kreira varijablu argumenata unutar sebe i dodjeljuje arguments.callee referencu sebi. Dakle arguments.callee.test je svojstvo func.test , tj. test statičke varijable.

U primjeru je bilo nemoguće napraviti zadatak:

Vartest = arguments.callee.test test++

jer bi u ovom slučaju operacija ++ radila na lokalnoj varijabli test, a ne na svojstvu testa funkcijskog objekta.

Objekt arguments također sadrži sve argumente i može se pretvoriti u niz (iako nije), više o tome kasnije u odjeljku o parametrima.

Opsegovi

Svaka funkcija, tačnije, čak i svako pokretanje funkcije, postavlja svoj individualni opseg.

Varijable se mogu deklarirati bilo gdje. Ključna riječ var specificira varijablu u trenutnom opsegu. Ako je zaboravite, varijabla će završiti u globalnom objektu prozora. Moguća su neočekivana ukrštanja sa drugim varijablama prozora, konflikti i kvarovi.

Za razliku od nekih jezika, blokovi ne definiraju poseban opseg. Nije bitno da li je varijabla definirana unutar bloka ili izvan njega. Dakle, ova dva isječka su savršeno ekvivalentna:

Varijabla definirana putem var je vidljiva svuda u opsegu, čak i prije naredbe var. Na primjer, napravimo funkciju koja će promijeniti varijablu, var za koju je ispod.

Na primjer:

Funkcija a() ( z = 5 // promijeniti z lokalno.. // .. jer je z deklariran preko var var z ) // izbriši z test // očisti globalni z samo u slučaju a() alert(window.z) // => nedefinirano jer je z promijenjen lokalno

Parametri funkcije

Funkcije se mogu izvoditi s bilo kojim brojem parametara.

Ako je manje parametara proslijeđeno funkciji nego što je u definiciji, onda se oni koji nedostaju smatraju nedefiniranima.

Sljedeća funkcija vraća vrijeme potrebno da se pređe udaljenost uz jednaku brzinu.

Prvi put kada se funkcija pokreće s argumentima distance=10, speed=undefined. Obično ova situacija, ako je podržana od strane funkcije, daje zadanu vrijednost:

// ako je brzina lažna (nedefinirano, 0, lažno...) - zamijenite 10 brzina = brzina || deset

Operater || u javascriptu ne vraća true/false, već samu vrijednost (prva koja se pretvara u true).

Stoga se koristi za postavljanje zadanih vrijednosti. U našem pozivu brzina će biti ocijenjena kao nedefinirana || 10 = 10 .

Dakle, rezultat će biti 10/10 = 1.

Drugo lansiranje je standardno.

Treće pokretanje navodi nekoliko dodatnih argumenata. Funkcija ne radi s dodatnim argumentima, pa se oni jednostavno zanemaruju.

Pa, u potonjem slučaju uopšte nema argumenata, tako da distance = undefined , i imamo rezultat dijeljenja undefined/10 = NaN (Nije-A-Broj, došlo je do greške).

Rad sa neograničenim brojem parametara

Neposredno prije ulaska u tijelo funkcije, automatski se kreira objekt argumenata koji sadrži

  1. Pozovite argumente, počevši od nule
  2. Dužina u svojstvu dužine
  3. Referenca na samu funkciju u svojstvu pozvanog

Na primjer,

Funkcija func() ( for(var i=0;i

Svojstvo arguments je poput niza po tome što ima dužinu i numeričke indekse. U stvari, argumenti ne pripadaju klasi Array i ne sadrže njene metode, kao što su push, pop i druge.

Ako i dalje želite koristiti ove metode, na primjer, za pozivanje druge funkcije s istim argumentima, ali pored prve, možete kreirati pravi niz od argumenata:

Var args = Array.prototype.slice.call(arguments) // .. sada je args pravi niz argumenata.. args.shift() ...

Možete pozvati funkciju na nizu argumenata koristeći apply:

Var func = function(a,b) (alert(a+b)) var arr = func.apply(null, arr) // => alert(3)

Primjer prosljeđivanja funkcije referencom

Funkcija se lako može proslijediti kao argument drugoj funkciji.

Na primjer, map uzima func funkciju, primjenjuje je na svaki element arr niza i vraća rezultirajući niz:

Var map = funkcija(func, arr) (var rezultat = for(var i=0; i

Primjer upotrebe:

Map(run, ) // =

Ili možete kreirati anonimnu funkciju direktno u pozivu mape:

// anonimna funkcija utrostručuje brojeve map(funkcija (a) ( return a*3 ) , ) // =

Sažimanje parametara u objekt

Postoje funkcije čiji se argumenti jako razlikuju.

Na primjer:

// može se specificirati samo dio argumenata // nije navedeno - izračunava se ili uzima prema zadanoj funkciji resize(toWidth, toHeight, saveProportions, animate) ( // zadane vrijednosti saveProportions = saveProportions || true animate = animate || true toHeight = toHeight | | ... )

Poziv sa opcionim parametrima se mora obaviti ovako:

resize(100, null, null, true)

Kako bi izbjegli nepotrebne nulte vrijednosti i učinili kod razumljivijim, oni koriste nešto poput "argumenata ključnih riječi" koji postoje u Pythonu i Rubyju. Da biste to učinili, mnogi parametri su spakovani u jedan objekt:

Funkcija resize(setup) ( // zadane vrijednosti var saveProportions = setup.saveProportions || true var animate = setup.animate || true var toHeight = setup.toHeight || ... )

Poziv je sada mnogo jednostavniji:

Var setup = (toWidth: 100, animate: true) resize(setup) // ili resize(toWidth: 100, animate: true))

Da, mnogo jasnije. A ako postoji više od 5 parametara, onda općenito - jedini normalan način.

Osim toga, praktičnije je napraviti nizove poziva s objektom kao što je:

var setup = (toWidth: 100, animate: true, saveProportions: false) resize(setup) setup.toWidth = 200 resize(setup)

Funkcije

Funkcija je blok JavaScript koda koji je definiran jednom i može se izvršiti ili pozvati više puta. Možda ste već upoznati sa konceptom "funkcije" pod drugim imenom, kao što je potprogram ili procedura. Funkcije mogu imati parametre: Definicija funkcije može uključivati ​​listu identifikatora koji se nazivaju parametri koji djeluju kao lokalne varijable u tijelu funkcije.

Kada se funkcije pozovu, njima se mogu proslijediti vrijednosti ili argumenti koji odgovaraju njihovim parametrima. Funkcije često koriste svoje argumente za izračunavanje povratne vrijednosti, koja je vrijednost izraza poziva funkcije. Pored argumenata, prilikom pozivanja bilo koje funkcije, prosljeđuje se još jedna vrijednost koja određuje kontekst poziva - vrijednost u ključnoj riječi ovo.

Funkcije u JavaScript-u su objekti i mogu se koristiti na mnogo načina. Na primjer, funkcije se mogu dodijeliti varijablama i proslijediti drugim funkcijama. Budući da su funkcije objekti, moguće je dodijeliti vrijednosti njihovim svojstvima, pa čak i pozvati njihove metode.

JavaScript dozvoljava da definicije funkcija budu ugniježđene unutar drugih funkcija, a takve funkcije će imati pristup svim varijablama prisutnim u opsegu definicije.

Definicija funkcije

Definicija funkcije počinje ključnom riječi funkcija nakon čega slijede sljedeće komponente:

Identifikator koji definira ime funkcije

Ime je obavezni dio izraza deklaracije funkcije: koristit će se za kreiranje nove varijable kojoj će biti dodijeljen novi objekt funkcije. U izrazima definicije funkcije, ime se može izostaviti: ako je prisutno, ime će se odnositi na objekt funkcije samo u tijelu same funkcije.

Par zagrada oko liste razdvojenih zarezima sa nula ili više identifikatora

Ovi identifikatori će definirati imena parametara funkcije i mogu se koristiti kao lokalne varijable u tijelu funkcije.

Par vitičastih zagrada sa nula ili više JavaScript naredbi unutra

Ove instrukcije čine tijelo funkcije: izvršavaju se svaki put kada se funkcija pozove.

Sljedeći primjer pokazuje nekoliko definicija funkcija u obliku naredbi i izraza. Imajte na umu da su definicije funkcija kao izrazi korisne samo ako su dio većih izraza, kao što je dodjela ili poziv funkcije, koji izvode neku radnju koristeći novo deklariranu funkciju:

// Ispisuje imena i vrijednosti svih svojstava funkcije obj objekta printprops(obj) ( for(var p in obj) console.log(p + ": " + obj[p] + "\n"); ) // Izračunava udaljenost između tačaka (x1,y1) i (x2,y2) funkcija distance(x1, y1, x2, y2) ( var dx = x2 - x1; var dy = y2 - y1; return Math.sqrt( dx*dx + dy*dy ); ) // Rekurzivna funkcija (poziva sama sebe) koja izračunava faktorijalnu funkciju factorial(x) ( if (x

Imajte na umu da u izrazima definicije funkcije ime funkcije može biti izostavljeno. Naredba deklaracije funkcije zapravo deklarira varijablu i dodjeljuje joj objekt funkcije.

Za razliku od toga, izraz definicije funkcije ne deklarira varijablu. Međutim, izrazima definicije je dozvoljeno da specificiraju ime funkcije, kao u gornjoj faktorskoj funkciji, koja može biti potrebna u tijelu funkcije da bi se sama pozvala. Ako izraz definicije funkcije uključuje ime, to ime će se odnositi na objekt funkcije u opsegu funkcije. U stvari, naziv funkcije postaje lokalna varijabla, dostupna samo unutar tijela funkcije. U većini slučajeva, ime funkcije nije potrebno u izrazima definicije, što definicije čini kompaktnijim.

Imajte na umu da većina (ali ne sve) funkcija u primjeru sadrži izraz return. Naredba return završava izvršavanje funkcije i vraća vrijednost njenog izraza (ako je specificirano) pozivajućem programu. Ako u naredbi return nema izraza, vraća se nedefinirano. Ako u funkciji nema naredbe return, tumač će jednostavno izvršiti sve naredbe u tijelu funkcije i vratiti nedefinirano pozivaocu.

Većina funkcija u primjeru procjenjuje neku vrijednost i koristi izraz return da vrati tu vrijednost pozivaocu. Funkcija printprops() je malo drugačija u ovom smislu: njen posao je da ispiše imena svojstava objekta. Ne mora vratiti nikakvu vrijednost, tako da u funkciji ne postoji izraz return. Funkcija printprops() će uvijek vratiti nedefinirano. (Funkcije koje nemaju povratnu vrijednost ponekad se nazivaju procedurama.)

Pozivanje funkcija

Programski kod koji formira tijelo funkcije se ne izvršava u trenutku kada je funkcija definirana, već u trenutku kada je pozvana. Pozivi funkcija se vrše pomoću izraza poziva. Izraz za pozivanje sastoji se od izraza poziva funkcije koji vraća funkcijski objekt, praćen zagradama s popisom razdvojenih zarezima sa nula ili više izraza argumenata.

Ako je izraz pristupa funkciji izraz pristupa svojstvu - ako je funkcija svojstvo objekta ili element niza (tj. metoda) - tada je izraz za pozivanje izraz za pozivanje metode. Sljedeći isječak pokazuje nekoliko primjera normalnih izraza poziva funkcije:

Printprops((x:4, starost: 24)); var d = udaljenost (1,1,5,6); var f = faktorijel(5) / faktorijel(12); f = kvadrat(5);

Kada se funkcija pozove, procjenjuju se svi izrazi argumenata (navedeni između zagrada), a rezultirajuće vrijednosti se koriste kao argumenti funkcije. Ove vrijednosti se dodjeljuju parametrima čija su imena navedena u definiciji funkcije. U tijelu funkcije, izrazi pristupa parametru vraćaju vrijednosti odgovarajućih argumenata.

Kada se pozove normalna funkcija, povratna vrijednost funkcije postaje vrijednost izraza poziva. Ako se funkcija vrati kada interpretator dođe do kraja funkcije, vraća se undefined. Ako se funkcija vraća kao rezultat povratne naredbe, vrijednost izraza nakon povratne izjave se vraća ili je nedefinirana ako izraz return nema izraz.

Metoda nije ništa drugo do funkcija koja je pohranjena kao svojstvo objekta. S obzirom na funkciju func i obj objekt, možete definirati metodu na obj objektu pod nazivom method, kao što je prikazano u nastavku:

// Definirajte jednostavan objekt i funkciju var obj = (); function func(a, b) ( return a+b;) // Dodavanje metode u obj objekt obj.method = func; // Sada možemo pozvati ovu metodu var result = obj.method(4, 5);

Najčešći način pozivanja metoda je korištenje oblika operatora tačke za pristup svojstvu, ali možete koristiti i oblik pristupa svojstvu uglastim zagradama. Na primjer, oba sljedeća izraza su izrazi poziva metode:

Rezultat = obj.method(4, 5); rezultat = obj["metod"](4, 5);

Argumenti i povratna vrijednost poziva metode se rukuju na potpuno isti način kao i normalni poziv funkcije. Međutim, pozivanje metoda ima jednu važnu razliku: kontekst pozivanja. Izraz pristupa svojstvu sastoji se od dva dijela: objekta (obj u ovom slučaju) i imena svojstva (metoda). U takvim izrazima poziva metoda, objekt obj postaje kontekst poziva, a tijelo funkcije može upućivati ​​na ovaj objekt koristeći ključnu riječ this. Na primjer:

Var obj = ( x: 0, y: 0, // Dodaj metodu: function(a, b) ( this.x = a; this.y = b; ), // Drugi zbroj metode: function() ( vrati ovo .x + this.y ) ); // Pozivanje metoda obj.add(15, 4); console.log(obj.sum()); // devetnaest

Metode i ključna riječ this su centralni za paradigmu objektno orijentiranog programiranja. Svaka funkcija koja se koristi kao metoda zapravo prima implicitni argument - objekt na kojem je pozvana. Obično metode izvode neku radnju na objektu, a sintaksa poziva metode jasno odražava činjenicu da funkcija radi na objektu.

Imajte na umu da je ovo ključna riječ, a ne ime varijabli ili svojstva. JavaScript sintaksa ne dozvoljava dodjeljivanje vrijednosti elementu this.

Argumenti i parametri funkcije

U JavaScriptu, definicije funkcija ne specificiraju tipove parametara, a kada se funkcije pozovu, ne izvode se provjere tipa na proslijeđenim vrijednostima argumenata. U stvari, kada se pozivaju funkcije u JavaScriptu, čak se i broj argumenata ne provjerava. Pododjeljci u nastavku opisuju što se događa ako je broj argumenata u pozivu funkcije manji ili veći od broja deklariranih parametara. Oni također pokazuju kako možete eksplicitno provjeriti tipove argumenata funkcije ako želite osigurati da funkcija nije pozvana s nevažećim argumentima.

Opcioni argumenti

Kada je broj argumenata u pozivu funkcije manji od broja deklariranih parametara, argumenti koji nedostaju postavljaju se na nedefinirano. Često je zgodno pisati funkcije tako da su neki od argumenata opcioni i da se mogu izostaviti kada se funkcija pozove. U ovom slučaju, poželjno je predvidjeti mogućnost dodjeljivanja razumno razumnih zadanih vrijednosti parametrima koji se mogu izostaviti. Na primjer:

// Dodajte nabrojana imena // svojstava obj objekta u niz arr i vratite ga. Ako nijedan argument // arr nije proslijeđen, kreirajte i vratite novu funkciju niza getPropertyNames(obj, /* opcionalno */ arr) ( if (arr === nedefinirano) arr = ; // Ako niz nije definiran, kreirajte novi one for( svojstvo var u obj) arr.push(property); return arr; ) // Ova funkcija se može pozvati sa 1 ili 2 argumenta: var a = getPropertyNames((x:1, y:1)); // Dobivamo svojstva objekta u novom nizu getPropertyNames((z:5),a); // dodaj svojstva novog objekta ovom nizu console.log(a); // ["x", "y", "z"]

Imajte na umu da kada deklarirate funkcije, neobavezni argumenti moraju završiti listu argumenata kako bi se mogli izostaviti. Programer koji će napisati poziv vašoj funkciji neće moći proći drugi argument i izostaviti prvi: biće primoran eksplicitno proći nedefinirano u prvom argumentu. Također obratite pažnju na /* opcioni */ komentar u definiciji funkcije, koji naglašava činjenicu da je parametar opcioni.

Liste argumenata promjenljive dužine

Ako broj argumenata u pozivu funkcije premašuje broj imena parametara, funkcija više ne može izravno pristupiti neimenovanim vrijednostima. Rješenje za ovaj problem je dato Argumenti prigovor. U tijelu funkcije, identifikator argumentima se odnosi na objekt Arguments prisutan u pozivu. Objekt Arguments je objekt sličan nizu koji vam omogućava da dohvatite vrijednosti proslijeđene funkciji prema njihovim brojevima umjesto njihovim imenima.

Pretpostavimo da je definirana funkcija func koja zahtijeva jedan argument x. Ako ovu funkciju pozovete sa dva argumenta, tada će prvi biti dostupan unutar funkcije po imenu parametra x ili kao argumenti. Drugi argument će biti dostupan samo kao argumenti. Također, kao i pravi nizovi, argumenti imaju svojstvo dužine koje specificira broj elemenata koje sadrži. To jest, u tijelu funkcije func koja se poziva s dva argumenta, arguments.length je 2.

Objekt Arguments može se koristiti u različite svrhe. Sljedeći primjer pokazuje kako ga koristiti za provjeru da li je funkcija pozvana s tačnim brojem argumenata, jer JavaScript to neće učiniti umjesto vas:

Funkcija func(x, y, z) ( // Prvo provjerite da li je proslijeđen ispravan broj argumenata if (arguments.length != 3) ( throw new Error("Func funkcija pozvana sa " + arguments.length + " argumentima, ali potrebno 3."); ) // A sada i sam kod funkcije... )

Imajte na umu da često nije potrebno provjeravati broj argumenata, kao u ovom primjeru. Zadano ponašanje JavaScript interpretera je dobro u većini slučajeva: nedostajući argumenti se zamjenjuju nedefiniranim, a dodatni argumenti se jednostavno zanemaruju.

Objekt Arguments ilustruje važnu karakteristiku JavaScript funkcija: one se mogu napisati tako da uzimaju bilo koji broj argumenata. Sljedeća funkcija uzima bilo koji broj argumenata i vraća vrijednost najvećeg od njih (ugrađena funkcija Math.max() ponaša se slično):

Funkcija maxNumber() ( var m = Broj.NEGATIVE_INFINITY; // Prođite kroz sve argumente, pronađite i // pohranite najveći od njih za(var i = 0; i m) m = argumente[i]; // Vratite najveću vrijednost return m ; ) var najveći = maxBroj(1, 10, 100, 2, 3, 1000, 4, 5, 10000, 6); // 10000

Funkcije poput ove koje mogu uzeti proizvoljan broj argumenata nazivaju se promjenljivim funkcijama, varijabilnim aritnim funkcijama ili varargs funkcijama. Ovaj termin je nastao pojavom programskog jezika C.

Imajte na umu da funkcijama s promjenjivim brojem argumenata ne smije biti dopušteno pozivanje s praznom listom argumenata. Ima smisla koristiti objekt argumenata kada pišete funkciju koja očekuje da će primiti fiksni broj potrebnih imenovanih argumenata, nakon čega slijedi proizvoljan broj neobaveznih neimenovanih argumenata.

Ne treba zaboraviti da argumenti zapravo nisu niz - to je objekt Arguments. Svaki objekat Arguments ima numerisane elemente niza i svojstvo dužine, ali tehnički to nije niz. Bolje je o njemu razmišljati kao o objektu koji ima neka nabrojana svojstva.

Pored elemenata svog niza, objekt Arguments definira svojstva pozvani i pozivalac. Pokušaj promjene vrijednosti ovih svojstava u strogom režimu ECMAScript 5 garantovano će izazvati izuzetak TypeError. Međutim, u opuštenom načinu rada, standard ECMAScript navodi da se svojstvo pozivatelja odnosi na funkciju koja se trenutno izvršava. Svojstvo pozivaoca nije standardno, ali je prisutno u mnogim implementacijama i odnosi se na funkciju koja je pozvala trenutnu.

Svojstvo pozivatelja može se koristiti za pristup steku poziva, a svojstvo pozivatelja je posebno korisno za rekurzivno pozivanje neimenovanih funkcija:

Var faktorijel = funkcija(x) (ako je (x

Svojstva i metode funkcije

Vidjeli smo da se funkcije mogu koristiti kao vrijednosti u JavaScript programima. Operator typeof vraća string "function" za funkcije, ali JavaScript funkcije su zaista posebna vrsta objekta. A pošto su funkcije objekti, one imaju svojstva i metode kao i svaki drugi objekt. Postoji čak i konstruktor Function() koji kreira nove funkcionalne objekte. Sljedeći pododjeljci opisuju svojstva i metode funkcija.

svojstvo dužine

U tijelu funkcije, svojstvo arguments.length određuje broj argumenata proslijeđenih funkciji. Međutim, svojstvo dužine same funkcije ima drugačije značenje. Ovo svojstvo samo za čitanje vraća broj argumenata koje funkcija očekuje da primi – broj deklariranih parametara.

Sljedeći isječak definira funkciju pod nazivom check() koja prima niz argumenata od druge funkcije. On uspoređuje svojstvo arguments.length (broj stvarno proslijeđenih argumenata) sa svojstvom arguments.callee.length (broj očekivanih argumenata) kako bi utvrdio da li je funkciji proslijeđeno onoliko argumenata koliko očekuje. Ako se vrijednosti ne podudaraju, izbacuje se izuzetak. Nakon funkcije check() slijedi test funkcija func(), koja pokazuje kako koristiti funkciju check():

// Ova funkcija koristi arguments.callee, tako da // neće raditi u strogom načinu rada function check(args) ( var current = args.length; // Stvarni broj argumenata var očekivan = args.callee.length; // Očekivani brojni argumenti if (stvarno !== očekivano) // Ako se ne podudaraju, izbacuje se izuzetak throw new Error("očekivano: " + očekivano + "; primljeno " + stvarno); ) funkcija func(x, y) , z) ( // Provjerite broj očekivanih argumenata i stvarno prošli provjeru (argumenti); // Sada pokrenite ostatak funkcije return x + y + z; )

svojstvo prototipa

Svaka funkcija ima svojstvo prototipa koje se odnosi na objekt poznat kao objekt prototipa. Svaka funkcija ima svoj vlastiti prototip objekta. Kada se funkcija koristi kao konstruktor, novokreirani objekt nasljeđuje svojstva tog prototipa objekta.

O prototipovima i svojstvima prototipa raspravljalo se u prethodnom članku.

call() i apply() metode

Metode call() i apply() omogućavaju vam da pozovete funkciju indirektno kao da je metoda nekog drugog objekta. Prvi argument i call() i apply() je objekt na kojem se poziva funkcija; ovaj argument definira kontekst poziva i postaje vrijednost ove ključne riječi u tijelu funkcije. Da biste pozvali funkciju func() (bez argumenata) kao metodu objekta obj, možete koristiti bilo koju od metoda, call() ili apply():

Func.call(obj); func apply(obj);

Bilo koji način pozivanja je ekvivalentan sljedećem isječku (pod pretpostavkom da obj nema svojstvo pod imenom m):

obj.m = funkcija; // Privremeno napravi func obj metodom obj.m(); // Pozovite ga bez argumenata. delete obj.m; // Ukloni privremeni metod.

U strogom načinu rada ECMAScript 5, prvi argument metoda call() i apply() postaje vrijednost this, čak i ako je jednostavna vrijednost, null ili nedefinirana. U ECMAScript-u 3 iu ne-striktnom načinu rada, null i undefined zamjenjuju se globalnim objektom, a jednostavna vrijednost odgovarajućim objektom omotača.

Svi ostali argumenti metode call() nakon prvog argumenta, koji specificira kontekst poziva, prosljeđuju se pozvanoj funkciji. Metoda apply() se ponaša kao call() metoda, osim što se argumenti funkciji prosljeđuju kao niz. Ako je funkcija sposobna da rukuje proizvoljnim brojem argumenata, metoda apply() može se koristiti za pozivanje takve funkcije u kontekstu niza proizvoljne dužine.

Sljedeći primjer pokazuje praktičnu upotrebu metode call():

// Ispod su dvije funkcije koje prikazuju svojstva i // vrijednosti svojstava proizvoljnog objekta. Metoda prikaza // se prosljeđuje kao argument func funkcija print1(func, obj) ( za (n u obj) func(n +": " + obj[n]); ) funkcija print2(func, objDevice, obj) ( za ( n u obj) func.call(objDevice, n +": " + obj[n]); ) var obj = (x:5, y:10); print2(document.write, dokument, obj); // Radi ispravno print2(console.log, console, obj); print1(document.write, obj); // Izuzetak nezakonitog pozivanja će biti pokrenut jer print1(console.log, obj); // ne može pozvati ove metode bez kontekstnog objekta

bind() metoda

Metoda bind() se prvi put pojavila u ECMAScript-u 5, ali je lako oponašati u ECMAScript-u 3. Kao što joj ime govori, glavna svrha metode bind() je da veže funkciju za objekt. Ako pozovete bind() metodu func i proslijedite joj obj objekt, vratit će novu funkciju. Pozivanje nove funkcije (kao normalne funkcije) pozvaće originalnu funkciju func kao metodu objekta obj. Svi argumenti proslijeđeni novoj funkciji bit će proslijeđeni originalnoj funkciji. Na primjer:

// Funkcija za povezivanje funkcije func(y) (vrati this.x + y; ) var obj = (x:1); // Objekt za vezanje za var g = func.bind(obj); // Pozivanje g(x) će pozvati obj.func(x)

Ovakvu vrstu vezivanja je lako implementirati u ECMAScript 3, kao što je prikazano u nastavku:

// Vraća funkciju koja poziva func kao metodu na obj // i prosljeđuje joj sve svoje argumente function bind(func, obj) ( if (func.bind) return func.bind(obj); // Koristi metodu bind ako je dostupno else return function() ( // Else se veže kao ispod return func. apply(obj, arguments); ); )

Metoda bind() u ECMAScript 5 radi više od jednostavnog povezivanja funkcije sa objektom. Također izvodi djelomičnu primjenu: osim vrijednosti this, svi argumenti proslijeđeni metodi bind() nakon njenog prvog argumenta bit će vezani. Djelomična primjena je uobičajena tehnika u funkcionalnom programiranju i ponekad se naziva currying.

Top Related Articles