2013-04-05 9 views
6

Mi confondo su una situazione di riferimento JavaScript this.JavaScript si riferisce alla finestra anziché alla funzione oggetto all'interno

Sto lavorando su un codice che dichiaro la funzione all'interno di un metodo oggetto. (Il motivo è di riordinare il codice all'interno di un metodo oggetto, mantenendo le funzioni private del metodo.)

Quello che segue è un esperimento per riprodurre il mio problema.

ho trovato che la funzione this all'interno greeting riferisce finestra portata anziché persona portata.

var person = { 
    nickname: "Makzan", 
    sayHi: function() { 
     console.log(this); 
     var greeting = function() { 
      console.log(this); 
      return "Aloha " + this.nickname; 
     } 
     console.log(greeting()); 
    } 
} 
person.sayHi(); 

(stesso codice in jsfiddle: http://jsfiddle.net/makzan/z5Zmm/)

E questo è il risultato di log in del browser:

> Object 
> Window 
Aloha undefined 

In JS, so che questo di riferimento è difficile. E posso cambiare l'ambito utilizzando il metodo .call per far funzionare questo codice.

var greeting = (function() { 
    console.log(this); 
    return "Aloha " + this.nickname; 
}).call(this); 

Tuttavia, sono curioso di sapere il motivo per cui per default il this riferiscono a finestra portata all'interno del saluto metodo?

Grazie in anticipo per tutto il vostro aiuto.

+1

È perché 'greeting' è chiamato senza un contesto. –

+0

Grazie a tutti. Imparo di più su cosa significa "contesto" ora. – Makzan

risposta

6

this non ha nulla a che fare con ambito. È determinato dal contesto .

greeting() chiama la funzione senza contesto, quindiè l'oggetto predefinito (window in un browser).

2

Prova person.nickname, questo si riferisce al saluto var nel tuo caso

4

this, i riferimenti non sono correlati all'ambito, dipende dal contesto di chiamata.

Come per la MDN doc,

In generale, l'oggetto associato a questo nell'ambito corrente è determinata da come la funzione corrente è stata chiamata

Problemi correlati