A this kicsit másképp működik a JavaScriptben, mint ahogy azt megszokhattuk
más nyelvekben. Ugyanis pontosan öt féle módja lehet annak, hogy a this
éppen mire utal a nyelvben.
this;
Amikor globális hatókörben van használva a this, akkor pontosan a globális objektumra utal.
foo();
Itt a this megint a globális objektumra fog utalni.
ES5 Megjegyzés: Strict módban a globális eset nem létezik többé. Ezekben az esetekben a
thisértéke undefined lesz.
test.foo();
Ebben a példában a this a test objektumra fog hivatkozni.
new foo();
Ha a függvény hívását a new kulcsszóval előzzük meg, akkor a függvény konstruktorként fog viselkedni. A függvényen belül, a this
az újonnan létrehozott Objektumra fog hivatkozni.
function foo(a, b, c) {}
var bar = {};
foo.apply(bar, [1, 2, 3]); // ugyanaz mint egy sorral lejjebb
foo.call(bar, 1, 2, 3); // argumentumok: a = 1, b = 2, c = 3
A Function.prototype-ban levő call vagy apply használatakor aztán elszabadul a pokol 😀.
Ezekben az esetekben ugyanis a this a foo hívásakor egzaktan be lesz állítva az apply/call
első argumentumára.
Ennek eredményképp az előzőekben említett Eljárás hívásakor rész nem érvényes,
a foo fentebbi meghívásakor a this értéke a bar objektumra lesz beállítva.
Megj.: A
thiskulcsszót nem lehetObjektumliterál létrehozásakor arra használni, hogy magára az objektumra hivatkozzon. Így avar obj = {me: this}kódban amenem fog athis-re hivatkozni, ugyanis ez az eset nem tartozik egyikhez sem a fent megtalálható öt közül.
Míg a fent megtalálható eseteknek van gyakorlatban vett értelme, az első a nyelv rossz designjára utal, ugyanis ennek soha nem lesz semmilyen praktikus felhasználási módja.
Foo.method = function() {
function test() {
// A this itt a globális ojjektum.
}
test();
};
Gyakori hiba, hogy úgy gondolják a fenti példában az emberek, hogy a this a test függvényen
belül az őt körülvevő Foo-ra fog mutatni, pedig nem.
Megoldásképp, hogy a Foo-hoz hozzáférhessük a test-en belül, szükségszerű egy változót
lokálisan elhelyezni a method-on belül, ami már valóban a kívánt this-re (Foo-ra) mutat.
Foo.method = function() {
var that = this;
function test() {
// Használjuk a that-et a this helyett
}
test();
};
A that tuladjonképpen egy mezei változónév (nem kulcsszó), de sokszor használják arra,
hogy egy másik this-re hivatkozzanak vele. A closure-ökkel kombinálva
ez a módszer arra is használható, hogy this-eket passzolgassunk a vakvilágban és még tovább.
Egy másik koncepció ami nem fog a JavaScriptben működni, az az alias függvények létrehozása, ami tulajdonképpen egy függvény másik névhez való kötését jelentené.
var test = someObject.methodTest;
test();
Az első eset miatt a test egy sima függvényhívásként működik, azonban a this értéke
a függvényen belül a továbbiakban nem a someObject lesz.
Elsőre a this alábbi módon való utánkötése (late binding) nem tűnik jó ötletnek.
Azonban ez az, amitől a prototípusos öröklődés is működni tud,
ami a nyelv egyik fő erőssége.
function Foo() {}
Foo.prototype.method = function() {};
function Bar() {}
Bar.prototype = Foo.prototype;
new Bar().method();
Amikor a method meghívódik a Bar példányaként, a this pontosan a Bar
megfelelő példányára fog mutatni.