Det här sökordet

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.


Hur är värdet av 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


De detta Nyckelordet hänvisar till huvudobjektet i kapslade funktioner

Du 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).


Arbeta runt det kapslade funktionsproblemet genom att använda leveranskedjan

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

 

Kontrollerar värdet av 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.


Använda detta Nyckelord inuti en användardefinierad konstruktörsfunktion

Nä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

 

Nyckelordet detta Inne i en prototypmetod hänvisar till en konstruktörinstans

Nä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

 

Slutsats

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.