Înțelegeți cu exactitate acest cuvânt cheie

Tutorialul de astăzi vine de la talentul Cody Lindley, din ebook-ul său gratuit: Iluminarea JavaScript. El discută problema confuză acest cuvântul cheie și diferitele moduri de determinare și de stabilire a valorii acestuia.

Tutorial publicat

La fiecare câteva săptămâni, revizuim câteva postări preferate ale cititorului nostru de-a lungul istoriei site-ului. Acest tutorial a fost publicat pentru prima oară în iulie 2011.


Conceptual Prezentare generală a acest

Când se creează o funcție, se creează un cuvânt cheie denumit acest lucru (în spatele scenei), care face legătura cu obiectul în care funcționează funcția. A spus într-un alt mod, acest lucru este disponibil scopului funcției sale, totuși este o referință la obiectul căruia această funcție este o proprietate / metodă.

Să aruncăm o privire la acest obiect:

 

Nu știu cum în interior getGender funcția, accesăm proprietatea de gen folosind notația punctului (de ex cody.gender) pe obiectul cody însuși. Aceasta poate fi rescrisă folosind acest pentru a accesa cody obiect pentru că acest arată spre cody obiect.

 

acest folosit in this.gender se referă doar la cody obiect pe care este funcția
de operare.

Subiectul acest poate fi confuz, dar nu trebuie să fie. Amintiți-vă că, în general, acest se utilizează în interiorul funcțiilor pentru a se referi la obiectul în care este cuprinsă funcția, spre deosebire de funcția în sine (excepțiile includ folosirea funcției nou cuvânt cheie sau apel() și aplica()).

Notite importante

  • Cuvântul cheie acest arată și acționează ca orice altă variabilă, cu excepția faptului că nu o puteți modifica.
  • - Spre deosebire de argumente și parametrii expediați la această funcție, acest este un cuvânt cheie (nu o proprietate) în obiectul de apel / activare.

Cum este valoarea lui acest Determinat?

Valoarea a acest, trecut la toate funcțiile, se bazează pe contextul în care funcția este numită în timpul rulării. Acordați atenție aici, deoarece aceasta este una dintre acele ciudățenii pe care trebuie doar să le memorați.

myObject obiect în codul de mai jos este dat o proprietate numită sayFoo, care indică sayFoo funcţie. Cand sayFoo este apelată din domeniul de aplicare global, aceasta se referă la obiectul ferestrei. Când se numește ca o metodă de myObject, acest se refera la myObject.

Since myObject are o proprietate numită foo, acea proprietate este folosită.

 

În mod evident, valoarea lui acest se bazează pe contextul în care se numește funcția. Luați în considerare ambele myObject.sayFoo și sayFoo indicați aceeași funcție. Cu toate acestea, în funcție de locul în care (respectiv contextul) sayFoo () este chemat din, valoarea lui acest e diferit.

Dacă aceasta ajută, aici este același cod cu obiectul cap (adică fereastră) utilizate în mod explicit.

 

Asigurați-vă că, pe măsură ce treceți în jurul funcțiilor sau aveți mai multe referințe la o funcție, vă dați seama că valoarea lui acest se va schimba în funcție de contextul în care se numește funcția.

Notă importantă

  • Toate variabilele cu excepția acest și argumentele urmează scopului lexical.

acest Cuvântul cheie se referă la obiectul capului din funcțiile învecinate

S-ar putea să te întrebi ce se întâmplă acest atunci când este utilizat în interiorul unei funcții care este cuprinsă în interiorul unei alte funcții. Vestea proastă este în ECMA 3, acest își pierde drumul și se referă la obiectul capului (fereastră obiect în browsere), în locul obiectului în care este definită funcția.


În codul de mai jos, acest interior de func2 și func3 își pierde drumul și nu se referă la myObject ci în locul obiectului capului.

 

Vestea bună este că aceasta va fi rezolvată în ECMAScript 5. Pentru moment, ar trebui să fiți conștienți de această situație dificilă, mai ales atunci când începeți să treceți funcțiile în jurul valorii de valori altor funcții.

Luați în considerare codul de mai jos și ce se întâmplă atunci când treceți o funcție anonimă la foo.func1. Atunci când funcția anonimă este apelată în interiorul lui foo.func1 (o funcție în interiorul unei funcții) acest valoarea în interiorul funcției anonime va fi o referință la obiectul capului.

 

Acum nu veți uita: acest valoarea va fi întotdeauna o referință la obiectul capului când funcția gazdă este încapsulată în interiorul unei alte funcții sau invocată în contextul unei alte funcții (din nou, aceasta este stabilită în ECMAScript 5).


Lucrând în jurul funcției învecinate

Așa că acest valoarea nu se pierde, puteți pur și simplu utiliza lanțul de domeniu pentru a păstra o referință la acest în funcția părinte. Codul de mai jos demonstrează cum se utilizează o variabilă numită acea, și valorificarea domeniului său de aplicare, putem urmări mai bine contextul funcțiilor.


Controlul valorii acest

Valoarea a acest este determinată în mod normal din contextul în care se numește o funcție (cu excepția cazului în care nou cuvântul cheie este folosit - mai multe despre asta într-un minut), dar puteți suprascrie / controla valoarea acest utilizând aplica() sau apel() pentru a defini ce obiect acest indică la invocarea unei funcții. Folosind aceste metode este ca și cum ai spune:Hei, apelați funcția X, dar spuneți funcției să utilizeze obiectul Z ca valoare pentru acest."Procedând astfel, metoda implicită în care JavaScript determină valoarea acest este suprasolicitat.

Mai jos, vom crea un obiect și o funcție. Apoi, invocăm funcția prin apel() astfel încât valoarea lui acest în interiorul funcției myObject ca și contextul său. Declarațiile din interiorul myFunction funcția va fi apoi populată myObject cu proprietăți în loc de a popula obiectul capului. Am modificat obiectul acest (interior de myFunction) se referă.

 

În exemplul de mai sus, folosim apel(), dar aplica() ar putea fi utilizate, de asemenea. Diferența dintre cele două este modul în care au trecut parametrii funcției. Utilizarea apel(), parametrii sunt doar valori separate prin virgulă. Utilizarea aplica(), valorile parametrilor sunt transmise în interiorul unui mulțime. Mai jos, este aceeași idee, dar folosind aplica().

 

Ceea ce trebuie să luați aici este că puteți să înlocuiți modul implicit în care JavaScript determină valoarea acest în scopul unei funcții.


Utilizarea acest Cuvinte cheie în interiorul unei funcții constructor definite de utilizator

Atunci când o funcție este invocată cu nou cuvânt cheie, valoarea de acest - așa cum se precizează în constructor - se referă la instanța însăși. A spus într-un alt mod: în funcția constructor, putem leverage obiect via acest înainte de crearea obiectului. În acest caz, valoarea implicită de acest schimbări într-un mod care nu este diferit de utilizare apel() sau aplica().

Mai jos, am creat o Persoană constructor funcția care utilizează acest pentru a face referire la crearea unui obiect. Când o instanță de Persoană este creat, acest nume va face referință la noul obiect creat și va plasa o proprietate numită Nume în noul obiect cu o valoare din parametru (Nume) a trecut la funcția de constructor.

 

Din nou, acest se referă la "obiectul care trebuie să fie" atunci când funcția constructor este invocată folosind nou cuvinte cheie. N-am fi folosit-o nou cuvânt cheie, valoarea de acest ar fi contextul în care se invocă Persoana - în acest caz obiectul capului. Să examinăm acest scenariu.

 

Cuvântul cheie acest În interiorul unei metode prototype se referă la un exemplu constructor

Când se utilizează în funcțiile adăugate la constructor prototip proprietate, acest se referă la instanța pe care se invocă metoda. Spune că avem un obicei Persoană() constructor. Ca parametru, este nevoie de numele complet al persoanei. În cazul în care trebuie să accesăm numele complet al persoanei, adăugăm a whatIsMyFullName metoda pentru a Person.prototype, așa că toate Persoană instanțe moștenesc metoda. Atunci când se utilizează acest, metoda se poate referi la instanța care îl invocă (și, prin urmare, la proprietățile sale).

Aici demonstrez crearea a două Persoană obiecte (cody și lisa) și moștenit whatIsMyFullName care conține acest cuvânt cheie pentru a accesa instanța.

 

Luați aici este faptul că cuvântul cheie acest este folosit pentru a se referi la cazuri când este utilizat în interiorul unei metode conținute în prototip obiect. Dacă instanța nu conține proprietatea, începe căutarea prototipului.

notițe

- Dacă instanța sau obiectul la care sa făcut referire acest nu conține proprietatea la care se face referire, se aplică aceleași reguli care se aplică oricărei căutări de proprietate și proprietatea va fi "privită" în lanțul prototip. Deci, în exemplul nostru, dacă Numele complet proprietatea nu a fost cuprinsă în instanța noastră atunci Numele complet ar fi căutat Person.prototype.fullName atunci Object.prototype.fullName.


Citiți cartea gratuit!

Această carte nu se referă la modelele de design JavaScript sau la implementarea unei paradigme orientate pe obiecte cu cod JavaScript. Nu a fost scris pentru a face distincția între caracteristicile bune ale limbajului JavaScript și cele rele. Nu este menit să fie un ghid de referință complet. Nu este destinat oamenilor noi de programare sau celor complet noi pentru JavaScript. Nu este nici o carte de bucate de rețete JavaScript. Acele cărți au fost scrise.

Cod