事件回调中是否需要匿名函数?

时间:2015-07-13 21:27:27

标签: javascript

目前,当我将包含我的自定义方法调用的匿名函数传递给事件回调时,我的代码可以正常工作,但是当我尝试直接在回调中调用自定义方法时,我的代码才有效... 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));

我试图理解为什么我的方法调用需要在它工作之前用匿名函数包装。我希望能够缩短代码并直接调用自定义方法,而不是通过匿名方法。

4 个答案:

答案 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