Het dit sleutelwoord

Wanneer een functie is gemaakt, wordt een sleutelwoord genoemd deze wordt gemaakt (achter de schermen), die linkt naar het object waarin de functie werkt. Zei een andere manier, deze is beschikbaar voor de reikwijdte van zijn functie, maar is een verwijzing naar het object waarvan die functie een eigenschap of methode is.

Laten we eens kijken naar de cody object van een vorig artikel:

Voorbeeld: sample98.html

 

Let op hoe binnenkant van de getGender functie, hebben we toegang tot de geslacht eigenschap met behulp van puntnotatie (cody.gender) op de 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.

Voorbeeld: sample99.html

 

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

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

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 het volgende codevoorbeeld krijgt een eigenschap met de naam sayFoo, die naar de sayFoo functie. Wanneer de sayFoo functie wordt aangeroepen vanuit de globale scope, deze verwijst naar de venster voorwerp. Wanneer het wordt aangeroepen als een methode van myObject, deze verwijst naar myObject.

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

Voorbeeld: sample100.html

 

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 (de context) sayFoo () wordt aangeroepen, de waarde van deze is anders.

Als het helpt, is hier dezelfde code als het hoofdobject (venster) expliciet gebruikt.

Voorbeeld: sample101.html

 

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

Alle variabelen behalve deze en argumenten volg de 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 (de venster object in browsers), in plaats van het object waarbinnen de functie is gedefinieerd.

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

Voorbeeld: sample102.html

 

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 het volgende voorbeeld en wat er gebeurt als u een anonieme functie doorgeeft 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.

Voorbeeld: sample103.html

 

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


Rond de kwestie van de geneste functie werken door de bereikketen te benutten

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

Voorbeeld: sample104.html

 

De waarde van controleren deze Gebruik makend van () aanroepen of van toepassing zijn()

De waarde van deze wordt normaal bepaald vanuit de context waarin een functie wordt aangeroepen (behalve wanneer het nieuwe sleutelwoord daarover in een minuut wordt gebruikt), maar u kunt de waarde van 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 als de waarde voor te gebruiken deze."Door dit te doen, de standaardmanier waarop JavaScript de waarde van bepaalt deze is overschreven.

In het volgende voorbeeld 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.

Voorbeeld: sample105.html

 

In het vorige voorbeeld hebben we gebruikt () 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 alleen door komma's gescheiden waarden. Gebruik makend van van toepassing zijn(), de parameterwaarden worden binnen een array doorgegeven zoals getoond in het volgende voorbeeld.

Voorbeeld: sample106.html

 

Wat u hier moet leren, 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 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 dezelfde manier als gebruiken () aanroepen of van toepassing zijn().

In het volgende voorbeeld 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 nieuw gemaakte object en plaatst een eigenschap genaamd naam in het nieuwe object met een waarde uit de parameter (naam) doorgegeven aan de constructorfunctie.

Voorbeeld: sample107.html

 

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 aangeroepen - in dit geval het hoofdobject. Laten we het volgende scenario bekijken:

Voorbeeld: sample108.html

 

Het sleutelwoord deze In een Prototype-methode verwijst naar een Constructor Instance

Bij gebruik in functies die aan constructeurs zijn toegevoegd 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.

Voorbeeld: sample109.html

 

Conclusie

Het concept om hier mee weg te nemen is dat het sleutelwoord dit wordt gebruikt om naar instanties te verwijzen wanneer deze worden gebruikt binnen een methode die is opgenomen in de prototype voorwerp. Als de instantie de eigenschap niet bevat, begint de prototypeopzoeking.

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 opzoeking van eigenschappen worden toegepast, en de eigenschap wordt "opgezocht" in de prototypeketen. Dus in ons voorbeeld, als het voor-en achternaam property was niet opgenomen in onze instance, voor-en achternaam zou worden gezocht Person.prototype.fullName, dan Object.prototype.fullName.