我有一个功能:
myObject.myFunction = function(callback){
callback();
}
和回调
randomObject.callBack = function(){
console.log(this);
}
如果我直接调用randomObject.callBack()
,我会在控制台中获取父对象。但是,如果我调用myObject.myFunction(randomObject.callBack)
,它会记录一个DOM元素。
如何访问父对象?
注意
我在运行时之前不知道回调父对象的名称。
答案 0 :(得分:5)
对象的上下文(即this
值)在函数运行时确定, not 在定义时。将randomObject.callBack
传递给另一个函数不会发送上下文(randomObject
位);它只是发送功能。
假设myFunction
调用上下文时设置了上下文。由于您没有明确提供上下文(例如,使用call
或apply
),因此上下文将是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
可能会解决四件事。
call
或apply
函数。在您的情况下,这样的事情可能是合适的:
myObject.myFunction(function(){randomObject.callBack()});
这会创建一个闭包,以便在myFunction
内,callback
被称为randomObject
的成员。