150

thisJavaScript では誰もが知っていることですが、ここselfのように実際に遭遇した例もあります。

では、 JavaScriptのthisとの違いは何ですか?self

4

5 に答える 5

163

他に設定されていない限り、 の値selfJavaScriptで の任意のプロパティに の代わりに ,として簡単にアクセスできるwindowためです。したがって、は 本当にであり、 とは異なります。xwindowxwindow.xselfwindow.selfthis

window.self === window; // true

グローバル スコープで実行され、strict モードではない関数を使用している場合、thisデフォルトはに設定されるwindowため、

function foo() {
    console.log(
        window.self === window, // is self window?
        window.self === this,   // is self this?
        this === window         // is this window?
    );
}
foo(); // true true true

別のコンテキストで関数を使用している場合、thisはそのコンテキストを参照しますがselfwindow.

// invoke foo with context {}
foo.call({}); // true false false

ここでWindow オブジェクトのW3C 2006 ワーキング ドラフトでwindow.self定義されていることがわかります。

于 2013-06-01T18:56:32.620 に答える
28

私はここに遅れていますが、さらに理解するのに役立つ1つの例に出くわしましたthis:

var myObject = {
 foo: "bar",
 func: function() {
    var self = this;
    console.log("outer func:  this.foo = " + this.foo);
    console.log("outer func:  self.foo = " + self.foo);
    (function() {
        console.log("inner func:  this.foo = " + this.foo);
        console.log("inner func:  self.foo = " + self.foo);
    }());
  }
};
myObject.func();

O/P

outer func:  this.foo = bar
outer func:  self.foo = bar
inner func:  this.foo = undefined
inner func:  self.foo = bar

ECMA 5 より前thisは、内部関数でグローバル ウィンドウ オブジェクトを参照していました。一方、ECMA 5 の時点thisでは、内部関数は未定義です。

于 2016-07-24T06:14:48.913 に答える