Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/478.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript回调窗口_Javascript_Callback - Fatal编程技术网

JavaScript回调窗口

JavaScript回调窗口,javascript,callback,Javascript,Callback,在下面的代码中,当调用func2b时,“this”是DOMWindow,而不是对obj2的引用。为什么func2b将obj2的引用丢失为“this” 以下是关于JSFIDLE的一个版本: 解决方案 var obj1 = { init: function() { this.prefix = "Stop!"; obj2.func2a(this, this.func1a); } ,func1a: function(message) { console.log(thi

在下面的代码中,当调用func2b时,“this”是DOMWindow,而不是对obj2的引用。为什么func2b将obj2的引用丢失为“this”

以下是关于JSFIDLE的一个版本:

解决方案

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

如果您这样做:

a.f()
f()
那么a在f的主体中被称为“this”

如果您这样做:

a.f()
f()
那么窗口在f的主体中称为“this”

编辑:正如Esailija所说:


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

函数没有绑定,它所指的内容取决于函数的调用方式。请阅读。因为此绑定是基于每次调用的,取决于函数的调用方式,而不是函数的存储位置。如果您在非严格模式下直接调用函数(
fun()
),它将始终位于浏览器中的
窗口
。感谢链接@FelixKling。我还不太确定我需要在我的示例中做什么更改才能使其生效,但我会继续阅读。这在理论上是有意义的,但这如何转化为我的示例?@scader你调用的是
回调(“锤子时间”)
类似
f()
,在这个答案中被调用。您不能将
callback
作为任何对象的属性调用,例如
lol.callback()
。请注意,您并不需要将函数作为某个对象的属性来获取所需的内容,您还可以说
callback.call(lol,“HAmmer time”)
,这将显式地将调用的
this
绑定到
lol
。或者在您的示例
callback.call(obj2,“锤子时间”)
感谢您的解释。这意味着obj2始终是调用的对象。如果func3a被多个对象调用呢。如何在call方法中分配正确的引用?将调用者传递给func3a。传递对象引用及其回调方法通常可以接受吗?