2010-11-19 15 views
3

Was ist die diese (innere Funktionen) im folgenden Code-Kontext beziehen? Zeigt es auf TimeSpan?Was bedeutet "dies" auf

var TimeSpan = function (days, hours, minutes, seconds, milliseconds) { 
var attrs = "days hours minutes seconds milliseconds".split(/\s+/); 

var gFn = function (attr) { 
    return function() { 
     return this[attr]; 
    }; 
}; 

var sFn = function (attr) { 
    return function (val) { 
     this[attr] = val; 
     return this; 
    }; 
}; 
} 

Dank

+2

In diesem Beispiel bezieht sich 'this' auf nichts, da keine dieser Funktionen jemals ausgeführt wird. Dies hängt davon ab, wie eine Funktion aufgerufen wird. – deceze

Antwort

10

this Der Wert wird implizit je nach , wie die Funktion aufgerufen wird, gibt es drei Fälle, in denen dies geschieht:

  1. Wenn eine Referenz ohne basen Objekt oder ein nicht- Bezug wird aufgerufen:

    myFn();    // the myFn reference has no base object 
    (function() {})(); // non-reference 
    

    der this Wert auf das globale Objekt zeigen wird

  2. Wenn eine Referenz ein Basisobjekt, beispielsweise enthält:

    myObj.method(); 
    

    Der this Wert innerhalb methodmyObj verweisen.

  3. Wenn der new Operator verwendet wird:

    var obj = new Foo(); 
    

    this Der Wert innerhalb des Foo Funktion wird auf eine neu erstellte Objekt verweisen, der aus Foo.prototype erbt.

Der this Wert kann auch explizit eingestellt werden, indem Sie die call und apply Methoden, beispielsweise mit call:

function test(a) { 
    return alert(this + a); 
} 

test.call("hello", " world"); // alerts "hello world" 

Oder mit apply wenn wir auf "anwenden" müssen ein Satz von Argumenten von einem Array zu einer Funktion:

function test(a, b) { 
    return alert(this + a + b); 
} 

var args = ["my ", "world "]; 
test.apply("hello ", args); // alerts "hello my world" 

[1] Dieser auf die neuen ECMAScript 5th Strict Mode geändert hat, nun, wenn eine Funktionsreferenz ohne Basisobjekt oder eine Nicht-Referenz (wie der erste Fall) aufgerufen wird, wird der this Wert enthält undefined.

Dies wurde gemacht, weil bei der Arbeit mit Konstruktorfunktionen häufig vergessen wurde, den Operator new beim Aufrufen des Konstruktors zu verwenden.

Wenn das passierte, zeigte der this Wert auf das globale Objekt, und das endete, unerwünschte globale Eigenschaften hinzuzufügen.

nun auf strikten Modus this enthält nicht definiert, und wenn Eigenschaft Nachschlag darauf (this.foo = 'foo') hergestellt ist, werden wir eine schöne TypeError Ausnahme haben, anstatt eine globale foo Eigenschaft hat.

+0

Ausgezeichnete Erklärung, hätte es nicht besser oder klarer sagen können :) – ChrisR

+0

Schöne Erklärung :) – XMen

+0

Sie wissen sicherlich Ihre Sachen! –

1

this bezieht sich auf das aktuelle Objekt, in diesem Fall die Funktion, die Sie innerhalb von sind. Da alles in JavaScript ein Objekt können Sie die Attribute eines Funktionsobjekts ändern mit dem this Stichwort: auf der tiefsten Ebene Umfang auf die Funktion hinweisen und nicht TimeSpan

var f = function() { 
    this.key = "someValue"; 
} 

console.log(f.key); // prints "someValue" 

Also in diesem Fall this sollte.