Cuvântul acest

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.


Cum este valoarea lui 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 î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 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).


Lucrând în jurul emisiunii de funcții învecinate prin utilizarea lanțului de domeniu

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

 

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


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

 

Cuvântul cheie acest Într-o metodă prototype se referă la o instanță constructor

Câ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

 

Concluzie

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.

Cod