Atunci când se creează o funcție, se cheamă un cuvânt cheie acest
este creată (în spatele scenei), care face legătura cu obiectul în care funcționează funcția. A spus altfel, acest
este disponibil scopului funcției sale, dar este o referință la obiectul căruia această funcție este o proprietate sau o metodă.
Să aruncăm o privire la cody
obiecte dintr-un articol anterior:
Mostră: sample98.html
Observați cum în interior getGender
funcționează, accesăm sex
proprietate folosind notația punct (cody.gender
) pe cody
obiect în sine. Aceasta poate fi rescrisă folosind acest
pentru a accesa cody
obiect pentru că acest
arată spre cody
obiect.
Mostră: sample99.html
acest
folosit in this.gender
se referă pur și simplu la obiectul Cody pe care funcționează funcția.
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()
).
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.
acest
Determinat?Valoarea a acest
, trecut la toate funcțiile, se bazează pe contextul în care funcția este apelată la timpul de execuție. Acordați atenție aici, deoarece aceasta este una dintre acele ciudățenii pe care trebuie doar să le memorați.
myObject
obiect în următoarea eșantion de cod este dat o proprietate numită sayFoo, care indică la sayFoo
funcţie. Cand sayFoo
este apelată din domeniul global, acest
se referă la fereastră
obiect. Când se numește ca o metodă a myObject, acest
se refera la myObject
.
De cand myObject
are o proprietate numită foo
, acea proprietate este folosită.
Mostră: sample100.html
Î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 (contextul) sayFoo ()
este chemat din, valoarea lui acest
e diferit.
Dacă vă ajută, aici este același cod cu obiectul cap (fereastră
) utilizate în mod explicit.
Mostră: sample101.html
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 acesteia se va schimba în funcție de contextul în care apelați funcția.
Toate variabilele cu excepția acest
și argumente
urmăriți domeniul de aplicare lexical
acest
Cuvântul cheie se referă la obiectul capului în funcțiile învecinateS-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 următorul cod, acest
interior de func2
și func3
își pierde drumul și nu se referă la myObject
ci în locul obiectului capului.
Mostră: sample102.html
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 următorul eșantion și ce se întâmplă atunci când treceți la o funcție anonimă 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.
Mostră: sample103.html
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. Următorul exemplu demonstrează cum se utilizează o variabilă numită acea
, și valorificarea domeniului său de aplicare, putem urmări mai bine contextul funcțiilor.
Mostră: sample104.html
acest
Utilizarea apel()
sau aplica()
Valoarea a acest
este determinată în mod normal din contextul în care se numește o funcție (cu excepția cazului în care se utilizează noul cuvânt cheie mai mult despre acesta într-un minut), dar puteți suprascrie și 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 ați spune: "Hei, apelați funcția X, dar spuneți funcției să utilizeze obiectul Z ca valoare acest
."Procedând astfel, metoda implicită în care JavaScript determină valoarea acest
este suprasolicitat.
În următorul exemplu, creăm 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ă.
Mostră: sample105.html
În exemplul anterior, am folosit 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 unei matrice așa cum se arată în următorul eșantion.
Mostră: sample106.html
Ceea ce trebuie să învățaț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 utilizatorAtunci când o funcție este invocată cu nou
cuvânt cheie, valoarea de acest
așa cum sa precizat î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
modificări într-un mod similar cu utilizarea apel()
sau aplica()
.
În exemplul următor, 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 obiectul nou creat și va plasa o proprietate denumită nume în obiectul nou cu o valoare din parametru (Nume
) a trecut la funcția de constructor.
Mostră: sample107.html
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 Persoană
este invocată - în acest caz obiectul capului. Să examinăm următorul scenariu:
Mostră: sample108.html
acest
Într-o metodă prototype se referă la o instanță constructorCând se utilizează în funcțiile adăugate unui 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.
Mostră: sample109.html
Conceptul de a lua aici este acea
acest cuvânt cheie este folosit pentru a se referi la instanțe atunci când sunt utilizate î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 a proprietății ș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ă, Numele complet
ar fi căutat Person.prototype.fullName
, atunci Object.prototype.fullName
.