JavaScript回调返回DOMWindow

时间:2012-05-30 22:12:48

标签: javascript callback

在下面的代码中,当调用func2b时,'this'是DOMWindow,而不是对obj2的引用。为什么func2b失去它对obj2的引用为'this'?

这是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();

1 个答案:

答案 0 :(得分:1)

如果你这样做:

a.f()

然后a在f的主体中称为'this'。

如果你这样做:

f()

然后窗口在f的主体中被称为“this”。

编辑:正如Esailija所说:

你正在使用回调(“Hammer Time。”),就像在这个答案中调用f()一样。