0

今まで、明確に理解するために、 これは常に関数の所有者を指すと考えていました。

私が検討したのは主に3つのケースでした。

  1. インスタンスメソッド、これはメソッドを呼び出すインスタンスです。
  2. イベント ハンドラー、要素は、イベントが呼び出される関数の所有者です。
  3. 関数はグローバル名前空間にあり、window は関数の所有者です

しかし、内部関数を作成してその関数をすぐに呼び出すとどうなるでしょうか。その場合でも、これはウィンドウを指します。

function outer(){
    var inner = (function(){
        console.log(this);
    })
    inner();
}

outer();

これがウィンドウを指す理由を簡単に説明できる人はいますか。

4

2 に答える 2

3

あなたはOO用語で考えていますが、投稿したコードはOOではありません。Rob Wが彼の投稿で述べたように、デフォルトthiswindowまたはundefined厳密モードです。

this特定の機能または状況が状況に応じて値を提供する場合にのみ、値を変更します。

関数がクラスシミュレーションで使用される場合、つまりnew、単に呼び出されるのではなく(を介して)インスタンス化thisされる場合、期待どおりにインスタンスを指します。

function Dog(name) {
    this.name = name;
    alert(name);
}
var fido = new Dog('Fido'); //alerts 'Fido'

コンテキストを提供する他の状況にthisは、イベントハンドラー(少なくともaddEventListenerモデルでは、古いIEではない)や、コンテキストを自分で使用call()またはapply()手動で設定するときが含まれます。this

thisまた、 JavaScriptの関数「owner」を指しているとは考えないでください。イベントではthis、影響を受ける要素を指しますが、その要素をコールバック関数を「所有している」と考えるのは役に立ちません。単にその要素のコンテキストで実行されているだけです。

最後に、Quentinが述べたように、の外部コンテキストを参照する方法はありませんthis。最初に変数にキャッシュする必要があります。

function Dog() {
    var that = this;
    setTimeout(function() {
        alert(this); //window - setTimeout() has overwritten the 'this' context
        alert(that); //we reference our cached, outer context
    }, 500);
}
var fido = new Dog('Fido');
于 2012-06-30T10:47:04.370 に答える
1

this( newbindcallまたはapplyマジックがない場合) は、関数が呼び出されたオブジェクトを参照します。

オブジェクトがない場合は、デフォルトのオブジェクトが使用されます。Web ブラウザーの場合、そのオブジェクトはwindow.

// all comments apply to "inside the body of the bar function"
foo.bar();     // this is foo
foo.baz.bar(); // this is baz
bar();         // this is window

this呼び出している関数のスコープに存在する別の変数に値をコピーできます。

function outer(){
    var that = this;
    var inner = (function(){
        console.log(that);
    })
    inner();
}

outer();

this…そして、さまざまな方法を使用して値を変更できます。

function outer(){
    var inner = (function(){
        console.log(this);
    })
    inner.apply(this);
}

outer();
于 2012-06-30T10:45:02.687 に答える