4

プロトタイプなしでクラスを作ろうとしています。次に例を示します。

test = (function() {
  this.value = 1;
  this.print = function() {
    console.log(this.value);
  };
  return this;
})();

これは意図したとおりに完全に機能します。私が理解していないthis.valueのは関数内this.printです。の言及が を参照し、 を参照していないことをどのようにthis.print正確に知ることができますか? 自動的に定義された関数はコンテキストとして追加されますか?thistestwindowthis.___ = function(){}this

4

1 に答える 1

11

this 常に1は、関数オブジェクトが呼び出されオブジェクトに評価されます。windowそれが「何も呼び出されなかった」(または のプロパティである) 場合は に評価されwindowます。

(は変数でthis はないため、クロージャで閉じられていないことに注意してください!これが、変数orthisによってしばしば知られる「正しい」値を取得するためにクロージャが必要になる場合がある理由です。)selfthat_this

例えば:

function f () { return this; }
var a = {f: f}
var b = {f: f}
a.f() === a     // true
b.f() === b     // true
f() === window  // true

変数を使用して現在のバインディングを作成する例(外側の関数が呼び出された時点) this:

test = (function() {
  var self = this // <-- variable, which is "closed over"
  this.value = 1; // self === this
  this.print = function() {
    console.log(self.value); // <-- self "names" previous this object
  };
  return this;
})();

1ちょっと嘘です。Function.callおよびFunction.apply関数を使用すると、コンテキストを指定でき、上記のように明示的な「自己閉鎖」の必要性をなくすthisなど、「コンテキスト バインディング」関数で使用できます。Function.bind

于 2012-06-10T00:09:44.343 に答える