2012-07-02 2 views
5

Könnte jemand bitte erklären, warum 'this' in den folgenden Punkten auf das DOM-Objekt und nicht auf Window? Wert von 'this' in Javascript

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

Daraus ergibt sich zu:

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

Folgendes berücksichtigen, die das gleiche Szenario sein sollte:

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

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

Was wir bekommen ist hier das Window-Objekt (was ich erwartet hatte).

+0

jQuery manipuliert 'dieses' wo nötig. – Blaster

+0

Wie üblich, das MDN hat einige gute Informationen dazu: https://developer.mozilla.org/en/DOM/element.addEventListener#The_value_of_this_within_the_handler – Niko

+0

Ich denke, die Person, die Sie fragen sollten, ist John Resig, der für das Konzept als verantwortlich ist soweit ich das beurteilen kann - ich glaube es ist sein Tun. Ob Sie es glauben oder nicht - aber er ist [ein aktives Mitglied hier] (http://stackoverflow.com/users/6524/john-resig). :) –

Antwort

5

Es hängt vom Kontext ab, in dem die Funktion ausgeführt wird. jQuery ändert explizit den Kontext der Callback-Funktion, während Ihre Funktion die Funktion im globalen Kontext ausführt.

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

Weiterführende Literatur

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

oder

:

, um den Kontext zu ändern

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

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

+0

Guter Antwortmann: P 'dieses' bezieht sich auch auf das gegenwärtige Element auf dem DOM, das angerufen wurde. +1 rep – Killrawr

+0

Ja, danke für diese Notiz :) – Gottox

+0

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

4

this wird durch den Kontext entschieden werden.

Wenn Sie Ihren Code wie folgt ändern, wird this auf some_other_object zeigen.

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

In Javascript unterscheidet sich OOP von dem, was Sie in Sprachen wie Java gewohnt sind.

Grundsätzlich ist es einfacher zu denken, dass es keine OOP gibt und dass this nur ein "verstecktes Argument" von Funktionen ist.

Zum Beispiel, wenn Sie sehen,

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

denken, dass gemeinsam OOP-Sprachen (wie Java), die

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

sein würde, wenn Sie var a = b.f(x, y, z); sehen, denken var a = f(b, x, y, z).

Wenn Sie sehen, var a = f(x, y, z); denken var a = f(undefined, x, y, z); (In-Browser-Umgebung, wenn strict mode nicht aktiviert ist, es f(window, x, y, z); ist)

Nun sollte es einfacher sein, zu verstehen, warum this in Ihrem Beispiel verschiedene Dinge in den verschachtelten Bereichen bedeutet.

+0

+1 - gute Erklärung –

2

jQuery verwendet die JavaScript-Funktion apply beim Aufrufen von Ereignishandlern. Aus der mdn-Dokumentation:

Ruft eine Funktion mit einem gegebenen diesen Wert und Argumente als Array zur Verfügung gestellt.