Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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_Oop_Callback_This - Fatal编程技术网

Javascript 查找回调函数的父对象

Javascript 查找回调函数的父对象,javascript,oop,callback,this,Javascript,Oop,Callback,This,我有一个功能: myObject.myFunction = function(callback){ callback(); } 还有回电话 randomObject.callBack = function(){ console.log(this); } 如果我直接调用randomObject.callBack(),我会在控制台中得到父对象。但是,如果我调用myObject.myFunction(randomObject.callBack),它会记录一个DOM元素 如何访问父对象 注

我有一个功能:

myObject.myFunction = function(callback){
  callback();
}
还有回电话

randomObject.callBack = function(){
  console.log(this);
}
如果我直接调用
randomObject.callBack()
,我会在控制台中得到父对象。但是,如果我调用
myObject.myFunction(randomObject.callBack)
,它会记录一个DOM元素

如何访问父对象


注意

运行前我不知道回调父对象的名称。

对象的上下文(即
值)是在函数运行时确定的,而不是在定义时确定的。将
randomObject.callBack
传递给另一个函数不会发送上下文(
randomObject
位);它只是发送函数

大概上下文是在
myFunction
调用它时设置的。由于您没有明确提供上下文(例如使用
调用
应用
),因此上下文将是
窗口
对象

您可以通过在函数运行之前明确说明函数的上下文应该是什么来改变这一点。您可以使用以下方法执行此操作:

现在,当您在
myFunction
内部调用
callback
时,将记录
randomObject


请注意,
bind
相对较新;并非所有浏览器都支持它。我上面链接的MDN页面有一些代码,可以在所有浏览器中使用。

这是因为当你调用一个没有对象的函数时,函数内的
将指向窗口对象。为了避免这种情况,我们通常这样做

myObject.myFunction = function(callback){
  callback();
}


randomObject.callBack = function(){
  console.log(this);
}

function proxyCallback(){
     randomObject.callBack();
}

myObject.myFunction(proxyCallback);

在javascript中,
这是指调用函数的对象上下文。这不一定与定义它的任何对象相关

您可以认为函数不是定义为对象的成员,而是被称为对象的成员

根据上下文,
可能解决四个问题

  • 如果函数调用前面有new关键字,则为新创建的对象
  • 调用函数时点左边的对象
  • 全局对象(通常为窗口),如果未提供上述任何一项
  • 提供给
    调用
    应用
    函数的第一个参数
  • 在您的情况下,这样做可能是合适的:

    myObject.myFunction(function(){randomObject.callBack()});
    

    这将创建一个闭包,以便在
    myFunction
    中,
    callback
    作为
    randomObject

    的成员调用。您忘记了如何
    。bind
    覆盖所有rules@RaynosIIRC,
    .bind
    只是一个函数,它创建了我的示例中的类型的闭包。根据它的实现方式,它将符合我的规则2或4。我错了吗?
    varo={};o、 foo=f.bind(null);o、 foo();//此===null
    .bind
    是硬绑定
    f.bind(null).调用({});//此===null
    。您无法撤消该绑定。这与
    o2.foo=function(){f.apply(null)}有何不同;o2.foo()
    (函数(){f.apply(null)}).call({})?您也无法撤消该绑定。我想说的是相反的-
    。bind
    模拟了创建闭包的机制。如果我在编写时不知道randomObject的名称,我需要在运行时建立它呢?因此代码是灵活的,不需要重写,因为我创建了该对象的新实例。忽略这一点,误解(读:扫描)你的答案。他很有魅力。太好了!
    myObject.myFunction(function(){randomObject.callBack()});