あなたは非常にトップレベルで変数を宣言するとき、あなたはwindow
オブジェクト内のグローバル変数を作成しているに等しいfoo.baz.x
のthis.x
equivilentを作り、何を参照するかですので、コンテキストは、foo.baz
です。トップレベルのキーワードthis
は、window
を指します。
var x = 4; // same as `window.x = 4`;
console.log(x); // same as `console.log(this.x)`;
あなたがobj.bar()
を呼び出すと、this
キーワードがbar
の内側obj
を指します。しかしsetTimeout
の中には、別のthis
があります。これは、setTimeout
に渡すコールバックの発信者を参照するものです。この呼び出し元はthis
の値を指定しないので、代わりにwindow
オブジェクトになります。したがって、このコードで:
setTimeout(function() {
var x = 1;
alert(this.x);
}, 1000);
this.x
は、グローバルスコープで上記に定義した通りである4
window.x
、同じです。あなたは、その関数がどこから来たの文脈失う関数を変数に割り当てるあなたの第二の例をアドレッシング
、:あなたはgo()
通知を呼び出すとき
var go = foo.baz.bar;
が今では、コール内にドットがない、これ暗黙的にthis
が存在しないことを意味する、明示的なオブジェクトアクセスがないことを意味します。この場合、あなたはまだcall
を使用してthis
を渡すことができます:あなたはuse strictで、これらの問題の多くを回避することができ
// 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());
。 strictモードでは、オブジェクトにデフォルト設定する代わりに、this
が明示的または暗黙的に定義されていないときは未定義になります。
これは、別の関数( 'setTimeout'に渡される関数)の中で呼び出すためです。 –