Quando viene creata una funzione, viene chiamata una parola chiave Questo
viene creato (dietro le quinte), che collega all'oggetto in cui opera la funzione. Detto in un altro modo, Questo
è disponibile per lo scopo della sua funzione, ma è un riferimento all'oggetto di cui quella funzione è una proprietà o un metodo.
Diamo un'occhiata al cody
oggetto da un precedente articolo:
Esempio: sample98.html
Notare come all'interno del getGender
funzione, stiamo accedendo al Genere
proprietà usando la notazione a punti (cody.gender
) sul cody
oggetto stesso. Questo può essere riscritto usando Questo
per accedere al cody
oggetto perché Questo
punta al cody
oggetto.
Esempio: sample99.html
Il Questo
usato in this.gender
si riferisce semplicemente all'oggetto di cody su cui opera la funzione.
L'argomento di Questo
può essere fonte di confusione, ma non deve essere. Ricordalo solo in generale, Questo
è usato all'interno delle funzioni per fare riferimento all'oggetto in cui è contenuta la funzione, al contrario della funzione stessa (le eccezioni includono l'uso di nuovo
parola chiave o chiamata()
e applicare()
).
La parola chiave Questo
guarda e agisce come qualsiasi altra variabile, tranne che non puoi modificarlo.
Al contrario di argomenti
e tutti i parametri inviati alla funzione, Questo
è una parola chiave (non una proprietà) nell'oggetto di chiamata / attivazione.
Questo
Determinato?Il valore di Questo
, passato a tutte le funzioni, si basa sul contesto in cui la funzione viene chiamata in fase di esecuzione. Fai attenzione qui, perché questa è una di quelle stranezze che devi solo memorizzare.
Il myObject
oggetto nel codice seguente viene fornita una proprietà chiamata sayFoo, che punta a sayFoo
funzione. Quando il sayFoo
la funzione è chiamata dall'ambito globale, Questo
si riferisce a finestra
oggetto. Quando viene chiamato come metodo di myObject, Questo
si riferisce a myObject
.
Da myObject
ha una proprietà chiamata foo
, quella proprietà è usata.
Esempio: sample100.html
Chiaramente, il valore di Questo
si basa sul contesto in cui viene chiamata la funzione. Considera che entrambi myObject.sayFoo
e sayFoo
puntare alla stessa funzione. Tuttavia, a seconda di dove (il contesto) sayFoo ()
è chiamato da, il valore di Questo
è diverso.
Se aiuta, ecco lo stesso codice con l'oggetto principale (finestra
) usato esplicitamente.
Esempio: sample101.html
Accertati che mentre passi le funzioni, o che abbia più riferimenti a una funzione, ti accorga che il valore di questo cambierà a seconda del contesto in cui chiami la funzione.
Tutte le variabili tranne Questo
e argomenti
segui lo scopo lessicale
Questo
La parola chiave si riferisce all'oggetto principale nelle funzioni annidatePotresti chiederti cosa succede Questo
quando è usato all'interno di una funzione che è contenuta all'interno di un'altra funzione. La cattiva notizia è nell'ECMA 3, Questo
perde la sua strada e si riferisce all'oggetto principale (il finestra
oggetto nei browser), invece dell'oggetto all'interno del quale è definita la funzione.
Nel seguente codice, Questo
all'interno di funz2
e FUNC3
perde la sua strada e si riferisce a non myObject
ma invece all'oggetto principale.
Esempio: sample102.html
La buona notizia è che questo verrà corretto in ECMAScript 5. Per ora, devi essere consapevole di questa situazione, specialmente quando inizi a passare le funzioni in giro come valori ad altre funzioni.
Considera il prossimo esempio e cosa succede quando si passa una funzione anonima a foo.func1
. Quando la funzione anonima è chiamata all'interno di foo.func1
(una funzione all'interno di una funzione), il Questo
il valore all'interno della funzione anonima sarà un riferimento all'oggetto principale.
Esempio: sample103.html
Ora non dimenticherai mai: il Questo
il valore sarà sempre un riferimento all'oggetto head quando la sua funzione host è incapsulata all'interno di un'altra funzione o invocata nel contesto di un'altra funzione (di nuovo, questo è corretto in ECMAScript 5).
In modo che la Questo
il valore non si perde, puoi semplicemente usare la catena di visibilità per mantenere un riferimento Questo
nella funzione genitore. Il seguente esempio mostra come, usando una variabile chiamata quello
, e sfruttando il suo scopo, possiamo tenere traccia del contesto delle funzioni.
Esempio: sample104.html
Questo
utilizzando chiamata()
o applicare()
Il valore di Questo
è normalmente determinato dal contesto in cui viene chiamata una funzione (tranne quando viene utilizzata la nuova parola chiave di più in un minuto), ma è possibile sovrascrivere e controllare il valore di Questo
utilizzando applicare()
o chiamata()
per definire quale oggetto Questo
punta a quando si richiama una funzione. L'utilizzo di questi metodi è come dire: "Ehi, chiama la funzione X ma dì alla funzione di usare l'oggetto Z come valore per Questo
."In questo modo, il modo predefinito in cui JavaScript determina il valore di Questo
è sovrascritto.
Nel prossimo esempio, creiamo un oggetto e una funzione. Quindi invochiamo la funzione tramite chiamata()
in modo che il valore di Questo
all'interno della funzione utilizza myObject
come contesto. Le dichiarazioni all'interno del myFunction
la funzione verrà quindi compilata myObject
con proprietà invece di popolare l'oggetto principale. Abbiamo modificato l'oggetto a cui Questo
(all'interno di myFunction
) si riferisce.
Esempio: sample105.html
Nell'esempio precedente, abbiamo usato chiamata()
, ma applicare()
potrebbe essere usato anche La differenza tra i due è come vengono passati i parametri per la funzione. utilizzando chiamata()
, i parametri sono solo valori separati da virgola. utilizzando applicare()
, i valori dei parametri vengono passati all'interno di un array come mostrato nel seguente esempio.
Esempio: sample106.html
Quello che devi imparare qui è che puoi sovrascrivere il modo predefinito in cui JavaScript determina il valore di Questo
nello scopo di una funzione.
Questo
Parola chiave all'interno di una funzione del costruttore definita dall'utenteQuando una funzione è invocata con il nuovo
parola chiave, il valore di Questo
come dichiarato nel costruttore si riferisce all'istanza stessa. Detto in un altro modo: nella funzione di costruzione, possiamo sfruttare l'oggetto tramite Questo
prima che l'oggetto sia effettivamente creato. In questo caso, il valore predefinito di Questo
cambia in modo simile all'utilizzo chiamata()
o applicare()
.
Nel seguente esempio, impostiamo a Persona
funzione di costruzione che utilizza Questo
per fare riferimento a un oggetto che si sta creando. Quando un'istanza di Persona
è creato, questo nome
farà riferimento all'oggetto appena creato e posizionerà una proprietà denominata nome nel nuovo oggetto con un valore dal parametro (nome
) passato alla funzione di costruzione.
Esempio: sample107.html
Ancora, Questo
si riferisce all '"oggetto che deve essere" quando la funzione di costruzione viene invocata usando il nuovo
parola chiave. Se non avessimo usato il nuovo
parola chiave, il valore di Questo
sarebbe il contesto in cui Persona
è invocato - in questo caso l'oggetto principale. Esaminiamo il seguente scenario:
Esempio: sample108.html
Questo
All'interno di un metodo prototipo fa riferimento a un'istanza del costruttoreSe utilizzato in funzioni aggiunte a costruttori prototipo
proprietà, Questo
si riferisce all'istanza su cui viene invocato il metodo. Diciamo che abbiamo un'usanza Persona()
funzione di costruzione. Come parametro, richiede il nome completo della persona. Nel caso in cui abbiamo bisogno di accedere al nome completo della persona, aggiungiamo a whatIsMyFullName
metodo per il Person.prototype
così che tutto Persona
le istanze ereditano il metodo. Quando si usa Questo
, il metodo può riferirsi all'istanza che lo richiama (e quindi alle sue proprietà).
Qui dimostro la creazione di due Persona
oggetti (cody
e lisa
) e l'ereditato whatIsMyFullName
metodo che contiene questa parola chiave per accedere all'istanza.
Esempio: sample109.html
Il concetto da portare via qui è quello
la parola chiave usata per riferirsi alle istanze quando viene usata all'interno di un metodo contenuto nel prototipo
oggetto. Se l'istanza non contiene la proprietà, inizia la ricerca del prototipo.
Se l'istanza o l'oggetto indicato da Questo
non contiene la proprietà a cui si fa riferimento, vengono applicate le stesse regole applicabili a qualsiasi ricerca di proprietà e la proprietà verrà "cercata" sulla catena di prototipi. Quindi nel nostro esempio, se il nome e cognome
la proprietà non era contenuta nella nostra istanza, nome e cognome
sarebbe cercato a Person.prototype.fullName
, poi Object.prototype.fullName
.