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

Pre*_*fix 3 javascript

目前,当我将一个匿名函数CONTAINING我的自定义方法调用传递给一个事件回调时,我的代码工作,但是当我尝试直接在回调中调用自定义方法时,我的代码工作... 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));
Run Code Online (Sandbox Code Playgroud)

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

acd*_*ior 5

// THIS DOES NOT. why? 
gt.pubads().addEventListener('slotRenderEnded', that.onSlotRenderEnded(event));
Run Code Online (Sandbox Code Playgroud)

在这种情况下,你的第二个参数实际上是调用的结果that.onSlotRenderEnded(event)(可能不是函数),这就是为什么它不起作用.

和不.它不要求它是一个无法发挥作用的功能.只是一个功能.

人们通常使用它们,因为这些动作功能(将响应事件)通常只在特定时刻和其他地方才需要.

但是,你仍然可以这样做:

gt.pubads().addEventListener('slotRenderEnded', function(event) {
    that.onSlotRenderEnded(event);
});
Run Code Online (Sandbox Code Playgroud)

要么

function someName(event) {
    that.onSlotRenderEnded(event);
}
gt.pubads().addEventListener('slotRenderEnded', someName);
Run Code Online (Sandbox Code Playgroud)

要么

var someName = function (event) {
    that.onSlotRenderEnded(event);
}
gt.pubads().addEventListener('slotRenderEnded', someName);
Run Code Online (Sandbox Code Playgroud)

或者,在这种情况下,即使您所做的只是委托,

gt.pubads().addEventListener('slotRenderEnded', that.onSlotRenderEnded);
Run Code Online (Sandbox Code Playgroud)

它们都应该表现相同*.

它们唯一可能的区别是值this,只能在实际呼叫时确定.在这种情况下,如果你想确定要采用的值this,你可以使用匿名(然后不使用this引用,但是一些其他变量,例如that你已经在问题中使用的),或者你可以诉诸$.proxy()一个适用于这些情况的效用函数,在你的情况下,使它成为:

gt.pubads().addEventListener('slotRenderEnded', $.proxy(that, 'onSlotRenderEnded'));
Run Code Online (Sandbox Code Playgroud)

(*当然,前提是你没有其他变量与sameName范围等等.)