this
Der Wert wird implizit je nach , wie die Funktion aufgerufen wird, gibt es drei Fälle, in denen dies geschieht:
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
Wenn eine Referenz ein Basisobjekt, beispielsweise enthält:
myObj.method();
Der this
Wert innerhalb method
myObj
verweisen.
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.
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