查找回调函数的父对象

时间:2012-01-11 13:13:44

标签: javascript oop callback this

我有一个功能:

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

和回调

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

如果我直接调用randomObject.callBack(),我会在控制台中获取父对象。但是,如果我调用myObject.myFunction(randomObject.callBack),它会记录一个DOM元素。

如何访问父对象?


注意

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

3 个答案:

答案 0 :(得分:5)

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

假设myFunction调用上下文时设置了上下文。由于您没有明确提供上下文(例如,使用callapply),因此上下文将是window对象。

您可以通过在运行之前明确说明函数的上下文来更改它。您可以使用bind方法执行此操作:

myObject.myFunction(randomObject.callBack.bind(randomObject))

现在,当您在callback内拨打myFunction时,系统会记录randomObject

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

答案 1 :(得分:1)

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

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


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

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

myObject.myFunction(proxyCallback);

答案 2 :(得分:1)

在javascript中,this指的是一个函数被称为的对象上下文。这不一定与定义的任何对象有关。

你可以把它想象成好像函数没有被定义为对象的成员,而是被称为对象的成员。

根据具体情况,this可能会解决四件事。

  1. 新创建的对象,如果函数调用前面有新关键字。
  2. 调用函数时点左侧的对象。
  3. 全局对象(通常是窗口),如果上面都没有提供。
  4. 第一个参数提供给callapply函数。
  5. 在您的情况下,这样的事情可能是合适的:

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

    这会创建一个闭包,以便在myFunction内,callback被称为randomObject的成员。