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()
parametereDe 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 metoderFunksjonsobjektet har følgende egenskaper (ikke inkludert arvelige egenskaper og metoder):
Eiendommer (Function.prototype;
):
prototype
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 ()
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
.
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.
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 funksjonerInne 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
arguments.callee
EiendomDe 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.
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
).
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.
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.
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
).
anrop()
og søke om()
)Funksjoner påberopes ved hjelp av fire ulike scenarier eller mønstre.
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.
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
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
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 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.
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.
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.
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.
Funksjoner er et av de mest brukte aspektene av JavaScript, forhåpentligvis har du nå en bedre forståelse av hvordan du bruker dem.