Når en funksjon er opprettet, kalles et søkeord dette
er opprettet (bak kulissene), som kobler til objektet der funksjonen opererer. Sa en annen måte, dette
er tilgjengelig for omfanget av sin funksjon, men er en referanse til objektet som funksjonaliserer en egenskap eller metode.
La oss ta en titt på cody
objekt fra en tidligere artikkel:
Eksempel: sample98.html
Legg merke til hvordan innsiden av getGender
funksjon, vi får tilgang til kjønn
eiendom ved hjelp av punktnotasjon (cody.gender
) på cody
objektet selv. Dette kan skrives om ved hjelp av dette
for å få tilgang til cody
objekt fordi dette
peker til cody
gjenstand.
Eksempel: sample99.html
De dette
brukt i this.gender
refererer ganske enkelt til cody-objektet som funksjonen fungerer på.
Emnet for dette
kan være forvirrende, men det trenger ikke å være. Bare husk det generelt, dette
brukes inne i funksjoner for å referere til objektet som funksjonen er inne i, i motsetning til selve funksjonen (unntak inkluderer bruk av ny
søkeord eller anrop()
og søke om()
).
Søkeordet dette
ser ut og virker som en hvilken som helst annen variabel, bortsett fra at du ikke kan endre den.
I motsetning til argumenter
og eventuelle parametere sendt til funksjonen, dette
er et søkeord (ikke en eiendom) i anrops- / aktiveringsobjektet.
dette
Fast bestemt?Verdien av dette
, bestått til alle funksjoner, er basert på konteksten der funksjonen kalles på kjøretid. Vær oppmerksom her, fordi dette er en av de som du bare trenger å huske.
De myObject
objekt i følgende kodeeksempel blir gitt en eiendom som heter sayFoo, som peker på sayFoo
funksjon. Når sayFoo
funksjon kalles fra det globale omfanget, dette
refererer til vindu
gjenstand. Når det kalles som en metode for myObject, dette
refererer til myObject
.
Siden myObject
har en eiendom som heter foo
, den egenskapen blir brukt.
Eksempel: sample100.html
Klart, verdien av dette
er basert på konteksten der funksjonen blir kalt. Tenk på at begge myObject.sayFoo
og sayFoo
pek på samme funksjon. Men avhengig av hvor (konteksten) sayFoo ()
er kalt fra, verdien av dette
er annerledes.
Hvis det hjelper, er her den samme koden med hodeobjektet (vindu
) eksplisitt brukt.
Eksempel: sample101.html
Pass på at når du overfører funksjoner, eller har flere referanser til en funksjon, innser du at verdien av dette vil endre seg avhengig av hvilken kontekst du kaller funksjonen i..
Alle variabler unntatt dette
og argumenter
følg leksikalsk omfang
dette
Søkeord refererer til hovedobjektet i nestede funksjonerDu lurer kanskje på hva som skjer med dette
når den brukes inne i en funksjon som finnes inne i en annen funksjon. Den dårlige nyheten er i ECMA 3, dette
mister sin vei og refererer til hodetobjektet (den vindu
objekt i nettlesere), i stedet for objektet der funksjonen er definert.
I følgende kode, dette
inni func2
og func3
mister sin vei og refererer ikke til myObject
men i stedet for hodet objektet.
Eksempel: sample102.html
Den gode nyheten er at dette vil bli løst i ECMAScript 5. For nå bør du være oppmerksom på dette problemet, spesielt når du begynner å overføre funksjoner som verdier til andre funksjoner.
Vurder den neste prøven og hva som skjer når du overfører en anonym funksjon til foo.func1
. Når den anonyme funksjonen kalles inne i foo.func1
(en funksjon inne i en funksjon), dette
Verdien inne i den anonyme funksjonen vil være en referanse til hodeobjektet.
Eksempel: sample103.html
Nå vil du aldri glemme: dette
verdien vil alltid være en referanse til hodeobjektet når vertsfunksjonen er innkapslet inne i en annen funksjon eller påkrevd i sammenheng med en annen funksjon (igjen er dette løst i ECMAScript 5).
Slik at dette
verdien går ikke tapt, du kan bare bruke omfanget kjeden for å holde en referanse til dette
i foreldrefunksjonen. Følgende eksempel demonstrerer hvordan, ved hjelp av en variabel som heter at
, og utnytte omfanget, kan vi holde øye med funksjonskonteksten bedre.
Eksempel: sample104.html
dette
Ved hjelp av anrop()
eller søke om()
Verdien av dette
er normalt bestemt av konteksten der en funksjon kalles (unntatt når det nye søkeordet brukes mer om det om et minutt), men du kan overskrive og kontrollere verdien av dette
ved hjelp av søke om()
eller anrop()
å definere hvilket objekt dette
peker til når man påkaller en funksjon. Å bruke disse metodene er som å si: "Hei, ring X-funksjon, men fortell funksjonen å bruke Z-objektet som verdien for dette
."Ved å gjøre det, er standard måten som JavaScript bestemmer verdien av dette
er overstyrt.
I den neste prøven lager vi et objekt og en funksjon. Vi kaller deretter funksjonen via anrop()
slik at verdien av dette
inne i funksjonen bruker myObject
som sin sammenheng. Erklæringene inne i myFunction
funksjonen vil da fylle seg myObject
med egenskaper i stedet for å fylle hodeobjektet. Vi har endret objektet til hvilket dette
(inni myFunction
) refererer.
Eksempel: sample105.html
I det forrige eksempelet brukte vi anrop()
, men søke om()
kan også brukes. Forskjellen mellom de to er hvordan parametrene for funksjonen er bestått. Ved hjelp av anrop()
, Parametrene er bare kommaseparerte verdier. Ved hjelp av søke om()
, Parameterverdiene sendes inne i en matrise som vist i den følgende prøven.
Eksempel: sample106.html
Det du trenger å lære her er at du kan overstyre standard måten som JavaScript bestemmer verdien av dette
i funksjonens omfang.
dette
Søkeord inne i en brukerdefinert konstruksjonsfunksjonNår en funksjon er påkalt med ny
søkeord, verdien av dette
som det fremgår av konstruktøren, refererer til selve forekomsten. Sa en annen måte: I konstruktørfunksjonen kan vi utnytte objektet via dette
før objektet faktisk er opprettet. I dette tilfellet er standardverdien for dette
endrer seg på en måte som ligner på bruk anrop()
eller søke om()
.
I den følgende prøven oppretter vi en Person
konstruktørfunksjon som bruker dette
for å referere til et objekt som opprettes. Når en forekomst av Person
er skapt, this.name
vil referere til det nyopprettede objektet og plassere et eiendom som heter navnet i det nye objektet med en verdi fra parameteren (Navn
) bestått til konstruktørfunksjonen.
Eksempel: sample107.html
En gang til, dette
refererer til "objektet som skal være" når konstruktørfunksjonen påberopes ved hjelp av ny
søkeord. Hadde vi ikke brukt ny
søkeord, verdien av dette
ville være konteksten der Person
påberopes - i dette tilfellet hodeobjektet. La oss undersøke følgende scenario:
Eksempel: sample108.html
dette
Inne i en prototypemetode refererer til en konstruktørinstansNår den brukes i funksjoner lagt til en konstruktør prototype
eiendom, dette
refererer til forekomsten som metoden er påkalt på. Si at vi har en skikk Person()
konstruktør funksjon. Som en parameter krever det personens fulle navn. Hvis vi trenger tilgang til personens fulle navn, legger vi til en whatIsMyFullName
metode til Person.prototype
slik at alt Person
tilfeller arver metoden. Når du bruker dette
, Metoden kan referere til forekomsten som påkaller den (og dermed dens egenskaper).
Her demonstrerer jeg opprettelsen av to Person
objekter (cody
og lisa
) og den arvede whatIsMyFullName
Metode som inneholder dette søkeordet for å få tilgang til forekomsten.
Eksempel: sample109.html
Konseptet å ta bort her er at
Søkeordet dette brukes til å referere til forekomster når det brukes inne i en metode som finnes i prototype
gjenstand. Hvis forekomsten ikke inneholder eiendommen, begynner prototypeoppslaget.
Hvis forekomsten eller objektet pekte på dette
inneholder ikke eiendommen som refereres, de samme reglene som gjelder for eiendomsoppslag blir brukt, og eiendommen blir "sett opp" på prototypekjeden. Så i vårt eksempel, hvis fullt navn
Eiendommen var ikke inneholdt i vårt eksempel, fullt navn
ville bli sett på Person.prototype.fullName
, deretter Object.prototype.fullName
.