gleich Wenn Sie eine Variable auf der obersten Ebene zu erklären, führen Sie eine globale Variable im window
Objekt zu erzeugen. Das Schlüsselwort this
auf der obersten Ebene bezieht sich auf window
.
var x = 4; // same as `window.x = 4`;
console.log(x); // same as `console.log(this.x)`;
Wenn Sie obj.bar()
nennen, bezieht sich der this
Schlüsselwort obj
innerhalb von bar
. Aber innerhalb setTimeout
haben Sie eine andere this
, die, die auf den Anrufer des Rückrufs bezieht, die Sie an setTimeout
übergeben. Dieser Aufrufer gibt keinen Wert für this
an, sondern wird stattdessen zum Objekt window
. Daher wird in diesem Code:
setTimeout(function() {
var x = 1;
alert(this.x);
}, 1000);
this.x
ist die gleiche wie window.x
, die 4
ist, wie Sie es oben im globalen Bereich definiert.
Adressierung Ihr zweites Beispiel, wenn Sie eine Funktion einer Variablen zuweisen verlieren Sie den Kontext, wo diese Funktion kam aus:
var go = foo.baz.bar;
Wenn Sie jetzt go()
Mitteilung nennen es gibt keinen Punkt in diesem Anruf, die bedeutet, dass es keinen expliziten Objektzugriff gibt, dh es gibt keine implizite this
.In diesem Fall können Sie noch this
vorbei call
mit:
// outputs `3` because `this` is `window`, and `window.x` is `3`
// as declared in the global scope
alert(go());
// Will output `2` because `this` is `foo`
alert(go.call(foo));
// Will output `1` because `this` is `foo.baz`
alert(go.call(foo.baz));
// Will output `1` because the implicit value of `this` is `foo.baz`
// since we have an explicit object access in this function call
alert(foo.baz.bar());
Sie viele dieser Probleme mit use strict vermeiden können. Im strikten Modus ist this
undefiniert, wenn nicht explizit oder implizit definiert, anstatt standardmäßig das Objekt window
.
Es ist, weil Sie es in einer anderen Funktion aufrufen (die an 'setTimeout' übergeben wird). –