目前,当我将包含我的自定义方法调用的匿名函数传递给事件回调时,我的代码可以正常工作,但是当我尝试直接在回调中调用自定义方法时,我的代码才有效... IE:
var that = this;
// THIS WORKS:
gt.pubads().addEventListener('slotRenderEnded', function(event) {
that.onSlotRenderEnded(event);
});
// THIS DOES NOT. why?
gt.pubads().addEventListener('slotRenderEnded', that.onSlotRenderEnded(event));
我试图理解为什么我的方法调用需要在它工作之前用匿名函数包装。我希望能够缩短代码并直接调用自定义方法,而不是通过匿名方法。
答案 0 :(得分:5)
// THIS DOES NOT. why?
gt.pubads().addEventListener('slotRenderEnded', that.onSlotRenderEnded(event));
在这种情况下,你的第二个参数实际上是调用that.onSlotRenderEnded(event)
(可能不是函数)的结果,这就是它无法工作的原因。
不。 不要求它是一个无法发挥作用的功能。只是一个功能。
人们通常会使用它们,因为这些动作功能(会响应事件)通常只在特定时刻才能使用,而不是其他任何地方。
但是,你仍然可以这样做:
gt.pubads().addEventListener('slotRenderEnded', function(event) {
that.onSlotRenderEnded(event);
});
或
function someName(event) {
that.onSlotRenderEnded(event);
}
gt.pubads().addEventListener('slotRenderEnded', someName);
或
var someName = function (event) {
that.onSlotRenderEnded(event);
}
gt.pubads().addEventListener('slotRenderEnded', someName);
或者,甚至,在这种情况下,由于您所做的只是委托,
gt.pubads().addEventListener('slotRenderEnded', that.onSlotRenderEnded);
他们所有应该表现相同 *。
唯一可能的区别是this
的值,只能在实际通话时确定。this
。在这种情况下,如果您想确定this
将采用的值,您可以使用匿名(然后不使用that
引用,但使用其他变量,例如{ {1}}你已经在问题中使用了),或者你可以使用$.proxy()
,这是一种适用于这些情况的效用函数,在你的情况下,它会像:
gt.pubads().addEventListener('slotRenderEnded', $.proxy(that, 'onSlotRenderEnded'));
(*当然,前提是您在范围内没有sameName
的其他变量,等等。)
答案 1 :(得分:2)
它不需要包含在匿名函数中。相反,传递函数定义而不执行(通过括号),如
gt.pubads().addEventListener('slotRenderEnded', that.onSlotRenderEnded);
传入回调时,您有两种选择。您传递匿名函数或传递函数定义。在这两种情况下,event
对象将自动作为回调的第一个参数传入。
答案 2 :(得分:0)
gt.pubads().addEventListener('slotRenderEnded', that.onSlotRenderEnded(event));
在这里,您只需使用undefined调用方法that.onSlotRenderEnded
,因为未定义事件。并将此方法的结果传递给addEventListener
答案 3 :(得分:0)
通过添加括号和传递事件,您将立即调用您的处理程序。放下那些,你应该没事。
所以而不是
that.onSlotRenderEvent(event)
只做
that.onSlotRenderEvent