4

次のjavascriptのカスタマイズされたクラスでは、コールバックで、なぜthis.objにローカル変数objだけがあり、必要なものがあるのですか?ありがとう。

function ClassTest(director) {
  this.obj = {"test1": "test1"};
}

function test1(input, callback) {
  callback("success");
}

ClassTest.prototype.test = function() {
  var obj = this.obj;
  test1("niuniu",function(e){
    console.log(this.obj);  // undefined
    console.log(obj);  // this one has stuff
    });
}

// run 
new ClassTest().test()
4

2 に答える 2

14

内部の関数が異なるコンテキストtest1で新しいスコープを作成しているためです。this典型的な解決策は、キャッシュするbindかキャッシュすることthisです。

バインディング:

test1("niuniu",function(e){
  console.log(this.obj);
}.bind(this));

キャッシング:

var self = this;
test1("niuniu",function(e){
  console.log(self.obj);
});
于 2013-02-03T07:31:05.350 に答える
2

このコード行について:

console.log(obj);  // this one has stuff

それが機能する理由は、JavaScriptクロージャがどのように機能するかに関係しています。無名関数で定義されたコードは、ローカルスコープ内のすべての変数と、包含スコープで定義された変数にアクセスできるため、obj使用できます。JavaScriptクロージャはどのように機能しますか?を参照してください。閉鎖の詳細については。

ただし、キーワードthisは現在のスコープへの参照です。this.obj匿名関数内からアクセスしているためthis、匿名関数自体を参照します。これにはobjプロパティが定義されていません。ClassTestプロトタイプを拡張しているencloseing関数では、プロパティが定義されてthisいる現在のClassTestオブジェクトを参照します。obj

于 2013-02-03T08:52:44.290 に答える