0

次のコードでは、func2b が呼び出されると、'this' は DOMWindow であり、obj2 への参照ではありません。func2b が「this」として obj2 への参照を失っているのはなぜですか?

jsFiddle のバージョンは次のとおりです: http://jsfiddle.net/qqzKh/

var obj1 = {
  init: function() {
    this.prefix = "Stop!";
    obj2.func2a(this.func1a);
  }
  ,func1a: function(message) {
    console.log(this.prefix + " " + message);
  }
};
var obj2 = {
  func2a: function(callback) {
    this.callback = callback;
    console.log(this.callback); // Correct reference to obj1.func1a
    obj3.func3a(this.func2b);
  }
  ,func2b: function(message) {
    console.log(this); // Unexpectedly returns DOMWindow
    this.callback(message);
  }
};
var obj3 = {
  func3a: function(callback) {
    callback("Hammer Time.");
  }
}
obj1.init();

解決

var obj1 = {
  init: function() {
    this.prefix = "Stop!";
    obj2.func2a(this, this.func1a);
  }
  ,func1a: function(message) {
    console.log(this.prefix + " " + message);
  }
};
var obj2 = {
  func2a: function(owner, callback) {
    this.owner = owner;
    this.callback = callback;
    obj3.func3a(this, this.func2b);
  }
  ,func2b: function(message) {
    this.callback.call(this.owner, message);
  }
};
var obj3 = {
  func3a: function(owner, callback) {
    callback.call(owner, "Hammer Time.");
  }
}
obj1.init();

</p>

4

1 に答える 1

1

もしあなたがそうするなら:

a.f()

その場合、a は f の本体で「this」と呼ばれます。

もしあなたがそうするなら:

f()

その場合、window は f の本体で「this」と呼ばれます。

編集:エサイリヤが言ったように:

この回答で f() が呼び出されるように、 callback("Hammer Time.") を使用しています。

于 2012-05-30T22:31:35.153 に答える