¿Se requiere una function anónima en una callback por evento?

Actualmente, mi código funciona cuando paso una function anónima que CONTIENE mi llamada de método personalizado en una callback de evento, pero no cuando bash llamar al método personalizado directamente en la callback … 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)); 

Intento entender por qué mi llamada al método debe ser envuelta en una function anónima antes de que funcione. Me gustaría poder acortar el código y llamar directamente al método personalizado en lugar de hacerlo a través del anónimo.

4 Solutions collect form web for “¿Se requiere una function anónima en una callback por evento?”

 // THIS DOES NOT. why? gt.pubads().addEventListener('slotRenderEnded', that.onSlotRenderEnded(event)); 

En este caso, su segundo argumento es en realidad el resultado de llamar that.onSlotRenderEnded(event) (probablemente no sea una function), es por eso que no funciona.

Y no. No requiere que sea una function anónima. Solo una function

La gente generalmente los usa porque esas funciones de acción (que responderán a los events) son, en la mayoría de los casos, necesarias solo en ese momento específico y en ningún otro lugar.

Pero, aún así, podrías hacer:

 gt.pubads().addEventListener('slotRenderEnded', function(event) { that.onSlotRenderEnded(event); }); 

o

 function someName(event) { that.onSlotRenderEnded(event); } gt.pubads().addEventListener('slotRenderEnded', someName); 

o

 var someName = function (event) { that.onSlotRenderEnded(event); } gt.pubads().addEventListener('slotRenderEnded', someName); 

O, incluso, en este caso, ya que todo lo que hace es delegar,

 gt.pubads().addEventListener('slotRenderEnded', that.onSlotRenderEnded); 

Todos deberían comportarse igual *.

La única diferencia posible en ellos es el valor de this , que solo se puede determinar en el momento de la llamada real. En este caso, si quiere estar seguro del valor que this tendrá, puede usar anonymous (y luego no usar la reference this , pero alguna otra variable, como la that ya está usando en la pregunta) , o puede recurrir a $.proxy() , una function de utilidad adecuada para estas situaciones, convirtiéndola, en su caso, en algo como:

 gt.pubads().addEventListener('slotRenderEnded', $.proxy(that, 'onSlotRenderEnded')); 

(* Por supuesto, siempre que no tenga otras variables con el mismo sameName en el scope, etc.)

No necesita envolverse en una function anónima. Más bien, pase la definición de la function sin ejecutar ( al tener el paréntesis ) como

 gt.pubads().addEventListener('slotRenderEnded', that.onSlotRenderEnded); 

Al pasar en una callback, tiene dos opciones. O pasas una function anónima o pasas una definición de function. En ambos casos, el object de event pasará automáticamente como el primer argumento de la callback.

 gt.pubads().addEventListener('slotRenderEnded', that.onSlotRenderEnded(event)); 

Aquí simplemente llama al método that.onSlotRenderEnded con undefined, ya que el evento no está definido. Y el resultado de este método se pasa a addEventListener

Al agregar los corchetes y el evento de paso, está llamando inmediatamente a su controller. Suelta esos y deberías estar bien.

Entonces, en lugar de

 that.onSlotRenderEvent(event) 

Solo haz

 that.onSlotRenderEvent 
Javascript tiene muchos buenos JS marco (como Node.js AngularJS Vue.js React.js) es el mejor lenguaje de script.