0

在下面的代码中,当调用 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();

​</p>

4

1 回答 1

1

如果你这样做:

a.f()

那么 a 在 f 的主体中被称为“this”。

如果你这样做:

f()

那么窗口在 f 的主体中被称为“this”。

编辑:正如 Esailija 所说:

您正在使用 callback("Hammer Time.") 之类的 f() 在此答案中被调用。

于 2012-05-30T22:31:35.153 回答