目前,当我将一个匿名函数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)
我试图理解为什么我的方法调用需要在匿名函数中包装才能工作.我希望能够缩短代码并直接调用自定义方法而不是通过匿名方法.
// 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范围等等.)
| 归档时间: |
|
| 查看次数: |
202 次 |
| 最近记录: |