När en funktion skapas kallas ett nyckelord detta
skapas (bakom kulisserna), som länkar till objektet där funktionen fungerar. Sade ett annat sätt, detta
är tillgängligt för dess funktion, men är en referens till det föremål som det funkar som en egenskap eller metod.
Låt oss ta en titt på cody
objekt från en tidigare artikel:
Prov: sample98.html
Lägg märke till hur insidan av getGender
funktion, vi har tillgång till kön
egendom med punktnotering (cody.gender
) på cody
objektet själv. Detta kan omskrivas med detta
för att komma åt cody
objekt eftersom detta
pekar på cody
objekt.
Prov: sample99.html
De detta
Använd i this.gender
hänvisar helt enkelt till cody-objektet som funktionen fungerar på.
Ämnet av detta
kan vara förvirrande, men det behöver inte vara. Kom bara ihåg det i allmänhet, detta
används inom funktionerna för att referera till objektet som funktionen finns i, i motsats till själva funktionen (undantag inkluderar att använda ny
sökord eller ring upp()
och tillämpa()
).
Nyckelordet detta
ser ut och fungerar som alla andra variabler, förutom att du inte kan ändra det.
I motsats till argument
och alla parametrar som skickas till funktionen, detta
är ett nyckelord (inte en egenskap) i samtals- / aktiveringsobjektet.
detta
Fast besluten?Värdet av detta
, passerat till alla funktioner, baseras på det sammanhang där funktionen kallas vid körtid. Var uppmärksam här, för det här är en av de saker du behöver bara memorera.
De myObject
objekt i följande kodprov ges en egenskap som heter sayFoo, vilket pekar på sayFoo
fungera. När sayFoo
funktion kallas från den globala räckvidden, detta
hänvisar till fönster
objekt. När det kallas som en metod för myObject, detta
refererar till myObject
.
Eftersom myObject
har en egendom som heter foo
, den egenskapen används.
Prov: sample100.html
Tydligt, värdet av detta
baseras på det sammanhang där funktionen kallas. Tänk på att båda myObject.sayFoo
och sayFoo
peka på samma funktion. Beroende på var (sammanhanget) sayFoo ()
kallas från, värdet av detta
är annorlunda.
Om det hjälper, är här samma kod med huvudobjektet (fönster
) uttryckligen används.
Prov: sample101.html
Se till att när du skickar runt funktioner eller har flera referenser till en funktion inser du att värdet på detta kommer att förändras beroende på det sammanhang där du ringer funktionen.
Alla variabler utom detta
och argument
följ lexisk räckvidd
detta
Nyckelordet hänvisar till huvudobjektet i kapslade funktionerDu kanske undrar vad som händer med detta
när den används inom en funktion som finns inne i en annan funktion. De dåliga nyheterna finns i ECMA 3, detta
förlorar sin väg och refererar till huvudobjektet (the fönster
objekt i webbläsare), istället för objektet inom vilket funktionen definieras.
I följande kod, detta
insidan av func2
och FUNC3
förlorar sin väg och hänvisar inte till myObject
men istället till huvudobjektet.
Prov: sample102.html
Den goda nyheten är att det här kommer att lösas i ECMAScript 5. För tillfället borde du vara medveten om detta problem, särskilt när du börjar överföra funktioner som värden till andra funktioner.
Tänk på nästa prov och vad som händer när du skickar en anonym funktion till foo.func1
. När den anonyma funktionen kallas inuti foo.func1
(en funktion inuti en funktion), detta
Värdet inuti den anonyma funktionen kommer att vara en referens till huvudobjektet.
Prov: sample103.html
Nu kommer du aldrig att glömma: detta
värdet kommer alltid att vara en referens till huvudobjektet när dess värdfunktion är inkapslad inuti en annan funktion eller påkallad inom ramen för en annan funktion (igen är detta fixat i ECMAScript 5).
Så att detta
värdet går inte vilse, du kan helt enkelt använda omfattningskedjan för att hålla en hänvisning till detta
i moderfunktionen. Följande prov visar hur man använder en variabel som heter den där
, och utnyttja dess omfattning, kan vi hålla bättre koll på funktionskontexten.
Prov: sample104.html
detta
Använder sig av ring upp()
eller tillämpa()
Värdet av detta
bestäms normalt från det sammanhang där en funktion kallas (förutom när det nya sökordet används mer om det på en minut), men du kan skriva över och styra värdet av detta
använder sig av tillämpa()
eller ring upp()
för att definiera vilket objekt detta
pekar på när man påbereder en funktion. Att använda dessa metoder är som att säga: "Hej, ring X-funktion men berätta för funktionen att använda Z-objektet som värdet för detta
."Genom att göra så, är standardmetoden som JavaScript bestämmer värdet av detta
är överdriven.
I nästa prov skapar vi ett objekt och en funktion. Vi anropar sedan funktionen via ring upp()
så att värdet av detta
inuti funktionsanvändningen myObject
som dess sammanhang. Uttalandena inom myFunction
funktionen kommer då att fyllas i myObject
med egenskaper istället för att fylla huvudobjektet. Vi har ändrat objektet till vilket detta
(insidan av myFunction
) hänvisar.
Prov: sample105.html
I det föregående exemplet använde vi ring upp()
, men tillämpa()
kan också användas. Skillnaden mellan de två är hur parametrarna för funktionen passeras. Använder sig av ring upp()
, parametrarna är bara kommaseparerade värden. Använder sig av tillämpa()
, Parametervärdena skickas inuti en matris som visas i följande prov.
Prov: sample106.html
Vad du behöver lära dig här är att du kan åsidosätta standardmetoden som JavaScript bestämmer värdet av detta
i en funktions räckvidd.
detta
Nyckelord inuti en användardefinierad konstruktörsfunktionNär en funktion påkallas med ny
sökord, värdet av detta
som det anges i konstruktören hänvisar till själva exemplet. Sagt ett annat sätt: I konstruktörfunktionen kan vi utnyttja objektet via detta
innan objektet faktiskt skapas. I det här fallet är standardvärdet för detta
ändras på ett sätt som liknar användning ring upp()
eller tillämpa()
.
I följande prov sätter vi upp en Person
konstruktör funktion som använder detta
för att referera till ett objekt som skapas. När en förekomst av Person
är skapad, detta namnet
kommer att referera till det nyskapade objektet och placera ett egendom som heter namn i det nya objektet med ett värde från parametern (namn
) överfördes till konstruktörfunktionen.
Prov: sample107.html
Igen, detta
hänvisar till "objektet som ska vara" när konstruktörfunktionen åberopas med hjälp av ny
nyckelord. Hade vi inte använt ny
sökord, värdet av detta
skulle vara det sammanhang i vilket Person
åberopas - i detta fall huvudobjektet. Låt oss undersöka följande scenario:
Prov: sample108.html
detta
Inne i en prototypmetod hänvisar till en konstruktörinstansNär den används i funktioner som läggs till en konstruktör prototyp
fast egendom, detta
hänvisar till förekomsten där metoden åberopas. Säg att vi har en anpassning Person()
konstruktörfunktion. Som en parameter krävs det personens fulla namn. Om vi behöver komma åt personens fullständiga namn lägger vi till en whatIsMyFullName
metod till Person.prototype
så att allt Person
instanser arva metoden. När man använder detta
, metoden kan referera till förekomsten som påkallar den (och därmed dess egenskaper).
Här visar jag skapandet av två Person
objekt (cody
och lisa
) och det ärftliga whatIsMyFullName
metod som innehåller det här sökordet för att komma åt förekomsten.
Prov: prov109.html
Konceptet att ta bort här är den där
Nyckelordet här används för att referera till instanser när det används inuti en metod som finns i prototyp
objekt. Om förekomsten inte innehåller egendomen börjar prototypuppsökningen.
Om förekomsten eller objektet pekade på av detta
innehåller inte egenskapen som referens, samma regler som gäller för eventuell egenskapsuppsättning tillämpas och egenskapen kommer att "se upp" på prototypkedjan. Så i vårt exempel, om fullständiga namn
egendom fanns inte i vår förekomst, fullständiga namn
skulle letas efter Person.prototype.fullName
, sedan Object.prototype.fullName
.