Una explicación de lo que está pasando. La respuesta de Pointy es buena, pero quiero explicarlo de manera más genérica. Se puede encontrar una muy buena investigación en this
here
Un controlador de eventos es solo una devolución de llamada. Le pasas una función y un evento para escuchar. Interalmente, todo lo que hará es llamar a esa función.
Animation.init es simplemente un getter para esa función. Piense en ello como esto:
var callback = Animation.init
animBtn.addEventListener('click', callback, false);
...
// internal browser event handler
handler() {
// internal handler does stuff
...
// Oh click event happened. Let's call that callback
callback();
}
Así que todo lo que has hecho se pasa en
var callback = function(){
this.doTheMove(); // I'm calling the function here, but it gives an error.
}
Por defecto en javascript this === window
. Esto se referirá al objeto global si no está configurado en algo. El efecto neto es que se llama window.doTheMove
. Y esa función no existe.
En este caso, ya callback
se llama convenientemente indicado por un Gestor de Eventos this
los puntos del objeto en el objeto DOM que ha activado el evento para que su llamada node.doTheMove
que todavía no existe.
Lo que quería hacer es envolverlo con una referencia a la animación.
var callback = function() {
Animation.init();
}
Esta es una ejecución de la función y se ejecuta en init
Animation
. Cuando lo ejecuta en un objeto como ese, internamente this === Animation
como era de esperar.
En resumen. El problema aquí es que Animation.init
es solo una referencia a una función. No tiene información sobre nada más, como mencionó Pointy.
Su respuesta es en su mayoría correcta (absolutamente correcta en el resultado final). El único error es * "El efecto neto es que se llama a window.doTheMove." *. Como 'init' se pasa a' addEventListener', en realidad se está llamando desde el contexto del elemento 'animBtn', por lo que' this.doTheMove() 'es efectivamente' animBtn.doTheMove() '. Nuevamente, el resultado final es el mismo. Solo un pequeño detalle. – user113716
@patrickdw Gracias, no estaba seguro de si 'this' se pasó como el objeto DOM o el objeto Window. No me molesté en probarlo para confirmarlo. Lo esperaba tanto. – Raynos
+1 Y, para ser justos, su evaluación de 'this' hubiera sido correcta si se hubiera utilizado' attachEvent' de Microsoft, ya que no establece (por algún motivo) el contexto del controlador. – user113716