2012-07-02 17 views
5

Czy ktoś mógłby wyjaśnić, dlaczego "to" w następujących punktach do obiektu DOM, a nie do okna?Wartość "this" w JavaScript

$("a").click(function() { 
    console.log(this); 
}); 

Daje do:

<a id="first" href="http://jquery.com"> 

Rozważmy następujący który powinien być taki sam scenariusz:

function Foo() { 
    this.click = function(f) { 
     f(); 
    } 
} 

var obj = new Foo(); 
obj.click(function() { 
    console.log(this); 
}); 

Co mamy oto obiektu window (czego się spodziewałem).

+0

jQuery manipuluje 'tym' w razie potrzeby. – Blaster

+0

Jak zwykle, MDN ma kilka dobrych informacji na ten temat: https://developer.mozilla.org/en/DOM/element.addEventListener#The_value_of_this_within_the_handler – Niko

+0

Myślę, że osobą, którą powinieneś zapytać jest John Resig, który jest odpowiedzialny za koncepcję jako o ile mogę powiedzieć - uważam, że to jego działanie. Wierzcie lub nie - ale on jest również [aktywnym członkiem tutaj] (http://stackoverflow.com/users/6524/john-resig). :) –

Odpowiedz

5

To zależy od kontekstu, w którym funkcja jest wykonywana. jQuery jawnie zmienia kontekst funkcji zwrotnej, podczas gdy twoja funkcja wykonuje funkcję w kontekście globalnym.

zmienić Kontekscie

function Foo() { 
    this.click = function(f) { 
     f.apply(this); 
    } 
} 

lub

function Foo() { 
    this.click = function(f) { 
     this.f = f 
     this.f(); 
    } 
} 

Dalsze odczytu:

http://dailyjs.com/2012/06/18/js101-this/

http://dailyjs.com/2012/06/25/this-binding/

+0

Dobra odpowiedź człowiek: P "this" odnosi się również do bieżącego elementu w DOM, który został wywołany. +1 rep – Killrawr

+0

Tak, dziękuję za tę notatkę :) – Gottox

+0

lub 'f.call (this);' – newacct

4

this zostanie rozstrzygnięty w kontekście.

Po zmianie kodu na niższy, this wskaże some_other_object.

function Foo() { 
    this.click = function(f) { 
     f.call(some_other_object); 
    } 
} 
6

W JavaScript OOP różni się od tego, do czego jesteś przyzwyczajony w językach takich jak Java.

Zasadniczo łatwiej jest myśleć, że nie ma żadnego OOP i że this to tylko "ukryty argument" funkcji.

Na przykład, gdy widzisz

function f(x, y, z) { 
    console.log(this, x, y, z); 
} 

myślę, że w popularnych języków OOP (takich jak Java) które byłyby

function f(this, x, y, z) { 
    console.log(this, x, y, z); 
} 

Kiedy widzisz var a = b.f(x, y, z);, pomyśl var a = f(b, x, y, z).

Kiedy widzisz var a = f(x, y, z); myśleć var a = f(undefined, x, y, z); (w środowisku przeglądarki, gdy strict mode nie jest aktywna, to f(window, x, y, z);)

Teraz powinno być łatwiej zrozumieć dlaczego this w przykładzie oznacza różne rzeczy w zagnieżdżonych zakresów.

+0

+1 - dobre wyjaśnienie –

2

jQuery używa funkcji javascript apply podczas wywoływania procedur obsługi zdarzeń. Z dokumentacji mdn:

Wywołuje funkcję o podanej wartości i argumentach dostarczonych jako tablica.

Powiązane problemy