2012-07-02 9 views
5

Qualcuno potrebbe spiegare perché "questo" nei seguenti punti all'oggetto DOM e non a Window?Valore di "this" in Javascript

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

Questo produce a:

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

Si consideri il seguente, che dovrebbe essere lo stesso scenario:

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

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

Quello che siamo arrivati ​​qui è l'oggetto window (quello che avevo previsto).

+0

jQuery manipola 'questo' dove necessario. – Blaster

+0

Come al solito, MDN ha alcune buone informazioni a riguardo: https://developer.mozilla.org/en/DOM/element.addEventListener#The_value_of_this_within_handler – Niko

+0

Penso che la persona che dovresti chiedere sia John Resig che è responsabile del concetto come Per quanto ne sappia, credo che sia opera sua. Che ci crediate o no - ma è [un membro attivo qui] (http://stackoverflow.com/users/6524/john-resig) pure. :) –

risposta

5

Spetta al contesto in cui viene eseguita la funzione. jQuery modifica esplicitamente il contesto della funzione di callback, mentre la funzione esegue la funzione nel contesto globale.

per cambiare il contesto:

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

o

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

Per ulteriori approfondimenti:

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

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

+0

Good answer man: P 'this' si riferisce anche all'elemento corrente sul DOM che è stato invocato. +1 rep – Killrawr

+0

Sì, grazie per quella nota :) – Gottox

+0

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

4

this sarà deciso dal contesto.

Se si modifica il codice in basso, quindi this punterà a some_other_object.

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

In Javascript, OOP è diverso da ciò a cui sei abituato in linguaggi come Java.

Fondamentalmente, è più facile pensare che non ci sia OOP e che this sia solo un "argomento nascosto" di funzioni.

Ad esempio, quando si vede

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

pensano che in linguaggi orientati agli oggetti comuni (come Java) che sarebbe

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

Quando vedi var a = b.f(x, y, z);, pensare var a = f(b, x, y, z).

Quando vedi var a = f(x, y, z); pensa var a = f(undefined, x, y, z); (In ambiente del browser, quando strict mode non è attivato, è f(window, x, y, z);)

Ora dovrebbe essere più facile capire perché this nel tuo esempio significa cose diverse in ambiti annidati.

+0

+1 - buona spiegazione –

2

jQuery utilizza la funzione javascript apply quando si chiama gestore di eventi. Dalla documentazione di mdn:

Chiama una funzione con un dato valore e argomenti forniti come matrice.

Problemi correlati