Funksjon()

En funksjon er en container med kodesetninger som kan påberopes ved hjelp av parentesene () operatør. Parametre kan sendes inn i parentesene under påkalling, slik at setningene i funksjonen kan få tilgang til visse verdier når funksjonen er påkalt.

I den følgende koden oppretter vi to versjoner av en addNumbers funksjonsobjektone ved hjelp av ny operatør og en annen ved å bruke det mer vanlige bokstavsmønsteret. Begge forventer to parametere. I hvert tilfelle påberoper vi funksjonen, passerer parametere i parentesene () operatør.

Eksempel: sample76.html

 

En funksjon kan brukes til å returnere en verdi, bygge et objekt, eller som en mekanisme for å bare kjøre kode. JavaScript har flere bruksområder for funksjoner, men i sin mest grunnleggende form er en funksjon bare et unikt omfang av kjørbare setninger.


Funksjon() parametere

De Funksjon() Konstruktøren tar et ubestemt antall parametere, men den siste parameteren forventes av Funksjon() konstruktør er en streng som inneholder setninger som omfatter funksjonens kropp. Eventuelle parametere som sendes til konstruktøren før sist, vil være tilgjengelige for funksjonen som opprettes. Det er også mulig å sende flere parametere som en kommaseparert streng.

I følgende kode kontrast jeg bruken av Funksjon() konstruktør med de mer vanlige mønstrene for å instantiere en funksjonsobjekt.

Eksempel: sample77.html

 

Gjør direkte bruk av Funksjon() Konstruktør anbefales ikke eller vanligvis gjøres enda fordi JavaScript vil bruke eval () å analysere strengen som inneholder funksjonslogikken. Mange vurderer eval () å være unødvendig overhead. Hvis det er i bruk, er det feil i utformingen av koden.

Bruker Funksjon() konstruktør uten ny Søkeordet har samme effekt som å bruke kun konstruktøren til å opprette funksjonsobjekter (ny funksjon ('x', 'return x') vs. funksjon (('x', 'return x')).

Ingen lukning opprettes når man påkaller Funksjon() konstruktør direkte.


Funksjon() Egenskaper og metoder

Funksjonsobjektet har følgende egenskaper (ikke inkludert arvelige egenskaper og metoder):

Eiendommer (Function.prototype;):

  • prototype

Egenskaper for objektobjektets egenskaper og metoder

Funksjonsobjektinstanser har følgende egenskaper og metoder (ikke inkludert arvelige egenskaper og metoder):

Instansegenskaper (var myFunction = funksjon (x, y, z) ; myFunction.length;):

  • argumenter
  • konstruktør
  • lengde

Instansmetoder (var myFunction = funksjon (x, y, z) ; myFunction.toString ();):

  • søke om()
  • anrop()
  • toString ()

Funksjoner Returner alltid en verdi

Selv om det er mulig å lage en funksjon bare for å utføre kodeoppsett, er det også svært vanlig for en funksjon å returnere en verdi. I den følgende prøven returnerer vi en streng fra si hei funksjon.

Eksempel: sample78.html

 

Hvis en funksjon ikke angir en returverdi, udefinert returneres. I den følgende prøven, kaller vi bjeff funksjon som logger strengen 'yelp' til konsollen uten å eksplisitt returnere en verdi.

Eksempel: sample79.html

 

Konseptet å ta bort her er at alle funksjoner returnerer en verdi, selv om du ikke eksplisitt gir en verdi å returnere. Hvis du ikke angir en verdi som skal returneres, er verdien returnert udefinert.


Funksjoner er førsteklasses borgere (ikke bare syntaks, men verdier)

I JavaScript er funksjoner objekter. Dette betyr at en funksjon kan lagres i en variabel, array eller objekt. Også en funksjon kan sendes til og returneres fra en funksjon. En funksjon har egenskaper fordi den er et objekt. Alle disse faktorene gjør funksjoner førsteklasses borgere i JavaScript.

Eksempel: sample80.html

 

Det er avgjørende at du skjønner at en funksjon er et objekt, og dermed en verdi. Den kan overføres eller forstørres som alle andre uttrykk i JavaScript.


Passerer parametere til en funksjon

Parametre er kjøretøy for å overføre verdier i omfanget av en funksjon når det påberopes. I den følgende prøven påberoper vi oss addFunction (). Siden vi har forhåndsdefinert det for å ta to parametere, blir to verdier tilgjengelige innenfor sitt omfang.

Eksempel: sample81.html

 

I motsetning til noen andre programmeringsspråk er det helt lovlig i JavaScript for å utelate parametere, selv om funksjonen er definert for å godta disse argumentene. De manglende parametrene er bare gitt verdien udefinert. Selvfølgelig, ved å gi ut verdier for parametrene, fungerer funksjonen kanskje ikke riktig.

Hvis du overfører en funksjon uventede parametere (de som ikke er definert når funksjonen ble opprettet), vil det ikke oppstå feil. Og det er mulig å få tilgang til disse parameterne fra argumenter objekt, som er tilgjengelig for alle funksjoner.


dette og argumenter Verdiene er tilgjengelige for alle funksjoner

Inne i omfanget og kroppen av alle funksjoner, den dette og argumenter verdier er tilgjengelige.

De argumenter objektet er en array-lignende gjenstand som inneholder alle parametrene som sendes til funksjonen. I den følgende koden, selv om vi avstår fra å angi parametere når vi definerer funksjonen, kan vi stole på argumenter array passert til funksjonen for å få tilgang til parametere hvis de blir sendt ved påkalling.

Eksempel: sample82.html

 

De dette Søkeord, bestått til alle funksjoner, er en referanse til objektet som inneholder funksjonen. Som du kanskje forventer, kan funksjoner som finnes i objekter som egenskaper (metoder) bruke dette å få en referanse til foreldreobjektet. Når en funksjon er definert i det globale omfanget, er verdien av dette er det globale objektet. Gå gjennom følgende kode og sørg for at du forstår hva dette er tilbake.

Eksempel: sample83.html

 

De arguments.callee Eiendom

De argumenter objektet har en eiendom som kalles callee, som er en referanse til funksjonen som for tiden utføres. Denne egenskapen kan brukes til å referere til funksjonen innenfor funksjonsområdet (arguments.callee) en selvreferanse. I den følgende koden bruker vi denne egenskapen for å få en henvisning til kallingsfunksjonen.

Eksempel: sample84.html

 

Dette kan være nyttig når en funksjon må kalles rekursivt.


Funksjonsinstansen lengde Eiendom og arguments.length

De argumenter objektet har en unik lengde eiendom. Mens du kanskje tror denne lengden, vil eiendommen gi deg antall definerte argumenter, det gir faktisk antall parametere sendt til funksjonen under påkalling.

Eksempel: sample85.html

 

Bruker lengde eiendom av alle Funksjon() forekomster, kan vi faktisk få tak i det totale antallet parametere funksjonen forventer.

Eksempel: sample86.html

 

De arguments.length Eiendommen ble utdatert i JavaScript 1.4, men antall argumenter sendt til en funksjon kan nås fra lengde egenskapen til funksjonsobjektet. Fremover kan du få lengdeverdien ved å utnytte callee eiendom til først å få referanse til funksjonen som påberopes (arguments.callee.length).


Redefinere funksjonsparametere

En funksjonsparameter kan omdefineres inne i funksjonen enten direkte, eller ved å bruke argumenter array. Ta en titt på denne koden:

Eksempel: sample87.html

 

Legg merke til at jeg kan omdefinere verdien av barparameteren ved hjelp av argumenter indeks eller ved direkte omfordeling av en ny verdi til parameteren.


Tilbakestill en funksjon før den er ferdig (Avbryt funksjonsutførelse)

Funksjoner kan kanselleres når som helst under påkall ved å bruke komme tilbake søkeord med eller uten verdi. I den følgende prøven avbryter vi Legg til Funksjon hvis parametrene er udefinert eller ikke et tall.

Eksempel: sample88.html

 

Konseptet å ta bort her er at du kan avbryte en funksjons utførelse ved å bruke komme tilbake søkeord til enhver tid i utførelsen av funksjonen.


Definere en funksjon (Statement, Expression eller Constructor)

En funksjon kan defineres på tre forskjellige måter: en funksjonskonstruksjon, en funksjonserklæring eller et funksjonsuttrykk. I det følgende eksemplet viser jeg hver variasjon.

Eksempel: sample89.html

 

Noen har sagt at det er en fjerde type definisjon for funksjoner, kalt "navngitt funksjonsuttrykk." Et navngitt funksjonsuttrykk er bare et funksjonsuttrykk som også inneholder et navn (f.eks., var add = funksjon legg til (x, y) return x + y).


Invitere en funksjon (Funksjon, Metode, Constructor, eller anrop() og søke om())

Funksjoner påberopes ved hjelp av fire ulike scenarier eller mønstre.

  • Som en funksjon
  • Som en metode
  • Som en konstruktør
  • Ved hjelp av søke om() eller anrop()

I det følgende eksemplet undersøker vi hvert av disse anropsmønstrene.

Eksempel: sample90.html

 

Sørg for at du er klar over alle fire påkallingsmønstrene, da koden du møter kan inneholde noen av dem.


Anonyme funksjoner

En anonym funksjon er en funksjon som ikke er gitt en identifikator. Anonyme funksjoner brukes mest for å overføre funksjoner som en parameter til en annen funksjon.

Eksempel: sample91.html

 

Self-Invoking Function Expression

Et funksjonsuttrykk (egentlig en hvilken som helst funksjon unntatt en opprettet fra Funksjon() konstruktør) kan umiddelbart påberopes etter definisjon ved å bruke parentesoperatøren. I følgende eksempel lager vi en sayWord () funksjonsuttrykk og deretter umiddelbart påkalle funksjonen. Dette anses å være en selvoppringende funksjon.

Eksempel: sample92.html

 

Self-invoking Anonymous Function Statements

Det er mulig å lage en anonym funksjonserklæring som er selvpåkalt. Dette kalles en anropsfunksjon som er selvbetjent. I den følgende prøven oppretter vi flere anonyme funksjoner som umiddelbart påberopes.

Eksempel: sample93.html

 

I henhold til ECMAScript-standarden kreves parenteser rundt funksjonen (eller alt som forvandler funksjonen til et uttrykk) hvis funksjonen skal påkalles umiddelbart.


Funksjoner kan være nestet

Funksjoner kan være inneholdt inne i andre funksjoner på ubestemt tid. I den følgende kodeprøven innkapsler vi goo fungere inne i Bar funksjon, som er inne i foo funksjon.

Eksempel: sample94.html

 

Det enkle konseptet her er at funksjonene kan nestes og det er ingen grense for hvor dypt nestingen kan gå.

Husk verdien av dette for nestede funksjoner vil være hovedobjektet (den vindu objekt i en nettleser) i JavaScript 1.5, ECMA-262, Utgave 3.


Passerer Funksjoner til Funksjoner og Retur Funksjoner Fra Funksjoner

Som tidligere nevnt, er funksjoner førsteklasses statsborgere i JavaScript. Og siden en funksjon er en verdi, og en funksjon kan bestås noen form for verdi, kan en funksjon overføres til en funksjon. Funksjoner som tar og / eller returnerer andre funksjoner kalles noen ganger "høyere rekkefølgefunksjoner.

I den følgende koden overfører vi en anonym funksjon til foo funksjon som vi deretter umiddelbart kommer tilbake fra foo funksjon. Det er denne anonyme funksjonen som variabelen Bar peker til, siden foo aksepterer og returnerer deretter den anonyme funksjonen.

Eksempel: sample95.html

 

Så når Bar påberopes, anropes den anonyme funksjonen som ble sendt til foo () funksjon, som deretter sendes tilbake fra foo () funksjon og referert fra Bar variabel. Alt dette er å fremheve det faktum at funksjoner kan sendes rundt akkurat som enhver annen verdi.


Innkalling av funksjonserklæringer før de er definert (aka funksjonshøyning)

En funksjonserklæring kan påberopes under utførelsen før den faktiske definisjonen. Dette er litt rart, men du bør være oppmerksom på det slik at du kan utnytte det, eller i det minste vite hva som skjer når du møter det. I følgende eksempel påkaller jeg sayYo () og sum() funksjonserklæringer før de er definert.

Eksempel: sample96.html

 

Dette skjer fordi før koden kjøres, blir funksjonserklæringer tolket og lagt til i utføringsbunken / konteksten. Sørg for at du er klar over dette når du bruker funksjonserklæringer.

Funksjoner definert som funksjonsuttrykk er ikke heiset. Bare funksjonserklæringer er heiset.


En funksjon kan kalle seg selv (aka rekursjon)

Det er helt legitimt for en funksjon å kalle seg selv. Faktisk brukes dette ofte i kjente kodemønstre. I koden som følger, sparker vi av countDownFrom funksjon, som deretter kaller seg via funksjonsnavnet countDownFrom. I hovedsak oppretter dette en sløyfe som teller ned fra 5 til 0.

Eksempel: sample97.html

 

Du bør være oppmerksom på at det er naturlig for en funksjon å påkalle seg selv (aka rekursjon) eller å gjøre det repeterende.


Konklusjon

Funksjoner er et av de mest brukte aspektene av JavaScript, forhåpentligvis har du nå en bedre forståelse av hvordan du bruker dem.