4

私は次のようなことをしてオブジェクトの状態を維持しようとしています:

obj = function() { 
    this.foo = undefined; 
    this.changeState = function () { 
        (function () { this.foo = "bar" })(); // This is contrived, but same idea.
    }; 
};

changeStateメソッドを呼び出すときに、インスタンス変数fooを「bar」に設定したいと思います。

例えば:

o = new obj();
o.changeState();
alert(o.foo); // This should say "bar"

私の知る限り、内部の無名関数の「this」がウィンドウを指していることが起こっています。何が起こっているのかわかりません。

私は正しい方向に進んでいますか?より良いアプローチはありますか?

4

4 に答える 4

4

このトピックはよく出てきますが、「これ」が SO 検索から削除されているため、検索するのが困難です。

基本的に、JavaScript では、this常にコンテキスト オブジェクトではなく、呼び出し元のオブジェクトを参照します。ここではグローバル スコープから o.changeState() を呼び出すため、thiswindow を参照します。

この場合、クロージャーが機能するために実際には内部関数は必要ありません。changeState関数自体は、字句スコープを閉じるのに十分です。

obj = function()
{
  var self = this; 
  this.foo = undefined; 
  this.changeState = function()
  {
    self.foo = "bar";
  }
} 
于 2009-09-08T16:39:47.460 に答える
3

関数を呼び出すときに this コンテキストを指定しない限り、デフォルトはグローバル (ブラウザーではウィンドウ) になります。

代替手段は次のとおりです。

obj = function() { 
  this.foo = undefined; 
  this.changeState = function () { 
    (function () { this.foo = "bar" }).call(this); // This is contrived, but same idea.
  }; 

};

また:-

obj = function() {
  var self = this;
  this.foo = undefined; 
  this.changeState = function () { 
    (function () { self.foo = "bar" })(); // This is contrived, but same idea.
  }; 

};

于 2009-09-08T16:35:58.967 に答える
3
function obj() { 
    this.foo = undefined; 
    this.changeState = function () { this.foo = "bar" };
};

var o = new obj();
o.changeState();
alert(o.foo);

私のために働きます。関数参照を割り当てるためだけに自己呼び出し関数を使用する理由や、関数宣言ではなくコンストラクターに関数式を使用する理由がわかりません。

于 2009-09-08T16:39:18.163 に答える
2

私はそれを考え出した。現在のコンテキストへの参照を保存し、それを内部の匿名関数で使用する必要がありました。

obj = function() { 
    this.foo = undefined; 
    var self = this; 
    this.changeState = function () { 
        (function () { self.foo = "bar" })();
    }; 
}; 
于 2009-09-08T16:34:01.310 に答える