La questa parola chiave

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.


Quanto è il valore di 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


Il Questo La parola chiave si riferisce all'oggetto principale nelle funzioni annidate

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


Lavorare attorno alla funzione nidificata Problema sfruttando la catena dell'ambito

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

 

Controllo del valore di 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.


Usando il Questo Parola chiave all'interno di una funzione del costruttore definita dall'utente

Quando 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

 

La parola chiave Questo All'interno di un metodo prototipo fa riferimento a un'istanza del costruttore

Se 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

 

Conclusione

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.