2013-04-05 3 views
6

Ich bekomme verwirrt auf eine JavaScript this Referenzsituation.JavaScript dies bezieht sich auf Fenster anstelle von Objekt innerhalb der Funktion

Ich arbeite an einem Code, der Funktion innerhalb einer Objektmethode deklariere. (Der Grund besteht darin, Code innerhalb einer Objektmethode aufzuräumen, während die Funktionen für die Methode privat bleiben.)

Das folgende ist ein Experiment, um mein Problem zu reproduzieren.

fand ich, dass die this innerhalb greeting Funktion des statt Person Umfang Fenster Anwendungsbereich bezieht.

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

(gleicher Code in jsfiddle: http://jsfiddle.net/makzan/z5Zmm/)

Und das ist das Log-Ergebnis in Browser:

> Object 
> Window 
Aloha undefined 

In JS, ich weiß, dass diese Referenz heikel ist. Und ich kann den Bereich ändern, indem ich .call Methode verwende, um diesen Code zu arbeiten.

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

Aber ich bin neugierig, warum standardmäßig die this zu Fenster Rahmen innerhalb des Methode Gruß beziehen?

Vielen Dank im Voraus für Ihre Hilfe.

+1

Es ist, weil 'greeting' genannt wird genannt bestimmt gebunden ohne Kontext. –

+0

Danke an alle. Ich lerne mehr darüber, was "Kontext" jetzt bedeutet. – Makzan

Antwort

6

this nichts mit Umfang zu tun hat. Es wird durch Kontext bestimmt.

greeting() ruft die Funktion ohne Kontext auf, so this ist das Standardobjekt (window in einem Browser).

2

Try person.nickname, bezieht sich dies auf den var Gruß in Ihrem Fall

4

Die this, Verweise bezieht sich nicht auf den Bereich, es hängt vom aufrufenden Kontext ab.

Gemäß den MDN doc,

Im Allgemeinen ist das Objekt dies im aktuellen Bereich ist durch, wie wurde die aktuelle Funktion

Verwandte Themen