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.
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.
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()
).
acest
arată și acționează ca orice altă variabilă, cu excepția faptului că nu o puteți modifica. argumente
și parametrii expediați la această funcție, acest
este un cuvânt cheie (nu o proprietate) în obiectul de apel / activare. 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.
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).
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.

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