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.
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
deze
Trefwoord Verwijst naar het hoofdobject in geneste functiesJe 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).
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
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.
deze
Trefwoord binnen een door de gebruiker gedefinieerde constructorfunctieWanneer 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
deze
In een Prototype-methode verwijst naar een Constructor InstanceBij 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
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
.