Het volledige begrip van dit sleutelwoord

De tutorial van vandaag komt met dank aan de getalenteerde Cody Lindley, uit zijn gratis ebook: JavaScript Enlightenment. Hij bespreekt het verwarrende deze zoekwoord en de verschillende manieren om de waarde ervan te bepalen en in te stellen.

Opnieuw gepubliceerde zelfstudie

Om de paar weken bekijken we enkele van onze favoriete lezers uit de geschiedenis van de site. Deze tutorial is voor het eerst gepubliceerd in juli 2011.


Conceptueel overzicht van deze

Wanneer een functie wordt gemaakt, wordt een sleutelwoord met de naam this gemaakt (achter de schermen), dat linkt naar het object waarin de functie werkt. Op een andere manier gezegd, dit is beschikbaar voor de reikwijdte van zijn functie, maar is een verwijzing naar het object waarvan die functie een eigenschap / methode is.

Laten we eens naar dit object kijken:

 

Notice hoe binnenkant van de getGender functie hebben we toegang tot de sekse-eigenschap met behulp van puntnotatie (bijv cody.gender) op het cody-object zelf. Dit kan worden herschreven met behulp van deze om toegang te krijgen tot de cody object omdat deze wijst naar de cody voorwerp.

 

De deze gebruikt in this.gender verwijst eenvoudigweg naar de cody object waarop de functie is
bedrijfs-.

Het onderwerp van deze kan verwarrend zijn, maar het hoeft niet zo te zijn. Onthoud dat gewoon in het algemeen, deze wordt gebruikt binnen functies om te verwijzen naar het object waarin de functie zich bevindt, in tegenstelling tot de functie zelf (uitzonderingen zijn onder andere het gebruik van de nieuwe trefwoord of () aanroepen en van toepassing zijn()).

Belangrijke aantekeningen

  • Het sleutelwoord deze ziet eruit en gedraagt ​​zich als elke andere variabele, behalve dat u deze niet kunt wijzigen.
  • - In tegenstelling tot argumenten en alle parameters die naar de functie zijn verzonden, deze is een sleutelwoord (geen eigenschap) in het oproep / activeringsobject.

Hoe is de waarde van deze Vastbesloten?

De waarde van deze, doorgegeven aan alle functies, is gebaseerd op de context waarin de functie tijdens runtime wordt aangeroepen. Let hier op, want dit is een van die eigenaardigheden die je gewoon moet onthouden.

De myObject object in de onderstaande code krijgt een eigenschap genaamd sayFoo, wat naar de sayFoo functie. Wanneer de sayFoo functie wordt aangeroepen vanuit het globale bereik, dit verwijst naar het vensterobject. Wanneer het wordt aangeroepen als een methode van myObject, deze verwijst naar myObject.

Since myObject heeft een eigenschap met de naam foo, die eigenschap wordt gebruikt.

 

Het is duidelijk dat de waarde van deze is gebaseerd op de context waarin de functie wordt aangeroepen. Overweeg dat beide myObject.sayFoo en sayFoo wijs naar dezelfde functie. Afhankelijk van waar (dat wil zeggen de context) sayFoo () wordt aangeroepen, de waarde van deze is anders.

Als het helpt, is hier dezelfde code met het hoofdobject (d.w.z. venster) expliciet gebruikt.

 

Zorg ervoor dat u tijdens het doorgeven van functies of meerdere verwijzingen naar een functie beseft dat de waarde van deze zal veranderen afhankelijk van de context waarin u de functie aanroept.

Belangrijke notitie

  • Alle variabelen behalve deze en argumenten volgen lexicale reikwijdte.

De deze Trefwoord Verwijst naar het hoofdobject in geneste functies

Je vraagt ​​je misschien af ​​wat er gebeurt deze wanneer het wordt gebruikt in een functie die zich in een andere functie bevindt. Het slechte nieuws zit in ECMA 3, deze verliest zijn weg en verwijst naar het hoofdobject (venster object in browsers), in plaats van het object waarbinnen de functie is gedefinieerd.


In de onderstaande code, deze binnenkant van func2 en FUNC3 verliest zijn zin en verwijst niet naar myObject maar in plaats daarvan naar het hoofdobject.

 

Het goede nieuws is dat dit zal worden opgelost in ECMAScript 5. Voor nu zou je je bewust moeten zijn van deze hachelijke situatie, vooral als je functies gaat gebruiken als waarden voor andere functies.

Overweeg de onderstaande code en wat er gebeurt wanneer u een anonieme functie doorgeeft aan foo.func1. Wanneer de anonieme functie binnen in wordt gebeld foo.func1 (een functie binnen een functie) de deze waarde in de anonieme functie is een verwijzing naar het hoofdobject.

 

Nu zul je het nooit vergeten: het deze waarde zal altijd een verwijzing naar het hoofdobject zijn wanneer de hostfunctie is ingekapseld in een andere functie of wordt aangeroepen in de context van een andere functie (nogmaals, dit wordt opgelost in ECMAScript 5).


Rondom de kwestie van de geneste functie werken

Zodat de deze waarde gaat niet verloren, je kunt gewoon de scopeketen gebruiken om een ​​verwijzing naar te houden deze in de ouderfunctie. De onderstaande code laat zien hoe, met behulp van een variabele genaamd dat, en door gebruik te maken van de scope, kunnen we de functiecontext beter volgen.


De waarde van controleren deze

De waarde van deze wordt normaal bepaald vanuit de context waarin een functie wordt aangeroepen (behalve wanneer de nieuwe sleutelwoord wordt gebruikt - meer hierover in een minuut), maar je kunt de waarde van overschrijven / beheren deze gebruik makend van van toepassing zijn() of () aanroepen om welk object te definiëren deze verwijst naar bij het oproepen van een functie. Het gebruik van deze methoden is hetzelfde als zeggen: "Hey, bel X-functie, maar vertel de functie om het Z-object te gebruiken als de waarde voor deze."Door dit te doen, de standaardmanier waarop JavaScript de waarde van bepaalt deze is overschreven.

Hieronder maken we een object en een functie. Vervolgens roepen we de functie via aan () aanroepen zodat de waarde van deze binnen de functie gebruikt myObject als de context. De uitspraken in de myFunction functie wordt vervolgens ingevuld myObject met eigenschappen in plaats van het hoofdobject te vullen. We hebben het object gewijzigd deze (binnenkant van myFunction) verwijst.

 

In het bovenstaande voorbeeld gebruiken we () aanroepen, maar van toepassing zijn() kan ook worden gebruikt. Het verschil tussen beide is hoe de parameters voor de functie worden doorgegeven. Gebruik makend van () aanroepen, de parameters zijn gewoon door komma's gescheiden waarden. Gebruik makend van van toepassing zijn(), de parameterwaarden worden doorgegeven binnen een rangschikking. Hieronder is hetzelfde idee, maar dan met van toepassing zijn().

 

Wat u hier moet wegnemen, is dat u de standaardmanier waarop JavaScript de waarde van bepaalt, overschrijft deze in het bereik van een functie.


De ... gebruiken deze Trefwoord binnen een door de gebruiker gedefinieerde constructorfunctie

Wanneer een functie wordt aangeroepen met de nieuwe sleutelwoord, de waarde van deze - zoals het is vermeld in de constructor - verwijst naar de instantie zelf. Anders gezegd: in de constructorfunctie kunnen we het object via gebruiken deze voordat het object daadwerkelijk is gemaakt. In dit geval is de standaardwaarde van deze veranderingen op een manier die niet veel lijkt op gebruiken () aanroepen of van toepassing zijn().

Hieronder hebben we een Persoon constructorfunctie die gebruikt deze om te verwijzen naar een object dat wordt gemaakt. Wanneer een instantie van Persoon is gecreëerd, deze naam verwijst naar het nieuwe object en plaatst een eigenschap met de naam naam in het nieuwe object met een waarde uit de parameter (naam) doorgegeven aan de constructorfunctie.

 

Nog een keer, deze verwijst naar het "object dat moet zijn" wanneer de constructorfunctie wordt aangeroepen met behulp van de nieuwe trefwoord. Hadden we de nieuwe sleutelwoord, de waarde van deze zou de context zijn waarin Persoon wordt opgeroepen - in dit geval het hoofdobject. Laten we dit scenario eens bekijken.

 

Het sleutelwoord deze In een prototype-methode verwijst naar een instantie van Constructor

Bij gebruik in functies die zijn toegevoegd aan een constructor prototype eigendom, deze verwijst naar de instantie waarop de methode wordt aangeroepen. Stel dat we een gewoonte hebben Persoon() constructorfunctie. Als parameter is de volledige naam van de persoon vereist. Als we de volledige naam van de persoon moeten gebruiken, voegen we een toe whatIsMyFullName methode om de Person.prototype, dus dat allemaal Persoon instanties nemen de methode over. Tijdens gebruik deze, de methode kan verwijzen naar de instantie die deze aanroept (en dus de eigenschappen ervan).

Hier demonstreer ik de creatie van twee Persoon voorwerpen (cody en lisa) en de geërfde whatIsMyFullName methode die het sleutelwoord this bevat om toegang te krijgen tot het exemplaar.

 

De afhaal hier is dat het sleutelwoord deze wordt gebruikt om te verwijzen naar instanties die worden gebruikt binnen een methode die is opgenomen in de prototype voorwerp. Als de instantie de eigenschap niet bevat, begint de prototypeopzoeking.

Notes

- Als de instantie of het object waarnaar wordt verwezen door deze bevat niet de eigenschap waarnaar wordt verwezen, dezelfde regels die van toepassing zijn op elke lookup voor eigenschappen worden toegepast en de eigenschap wordt "opgezocht" in de prototypeketen. Dus in ons voorbeeld, als het voor-en achternaam eigendom was toen nog niet binnen onze instantie voor-en achternaam zou worden gezocht Person.prototype.fullName dan Object.prototype.fullName.


Lees het boek gratis!

Dit boek gaat niet over JavaScript-ontwerppatronen of het implementeren van een objectgeoriënteerd paradigma met JavaScript-code. Het is niet geschreven om de goede eigenschappen van de JavaScript-taal te onderscheiden van de slechte. Het is niet bedoeld als een complete naslaggids. Het is niet gericht op mensen die nieuw zijn bij het programmeren of die helemaal nieuw zijn voor JavaScript. Dit is ook geen kookboek met JavaScript-recepten. Die boeken zijn geschreven.