Una spiegazione di ciò che sta accadendo. La risposta di Pointy è buona, ma voglio spiegarla in modo più generico. Un'ottima ricerca su this
può essere trovata here
Un gestore di eventi è solo un callback. Si passa una funzione e un evento per ascoltare. Interamente tutto ciò che farà è chiamare quella funzione.
Animation.init è solo un getter per quella funzione. Pensate a come questo:
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();
}
Quindi tutto quello che hai fatto è passato in
var callback = function(){
this.doTheMove(); // I'm calling the function here, but it gives an error.
}
Per impostazione predefinita in javascript this === window
. Questo si riferirà all'oggetto globale se non è impostato su qualcosa. L'effetto netto è che viene chiamato window.doTheMove
. E quella funzione non esiste.
In questo caso, poiché callback
è actaully chiamato da un evento Handler i punti oggetto this
presso l'oggetto DOM che ha attivato l'evento in modo che le chiamate node.doTheMove
che ancora non esiste.
Quello che volevi fare è racchiuderlo con un riferimento all'Animazione.
var callback = function() {
Animation.init();
}
Questa è una funzione di esecuzione ed esegue init
su Animation
. Quando lo esegui su un oggetto del genere allora internamente this === Animation
come ti aspetteresti.
Per riassumere. Il problema qui è che Animation.init
è solo un riferimento a una funzione. Non ha informazioni su nient'altro come Pointy menzionato.
La tua risposta è per la maggior parte corretta (assolutamente corretta nel risultato finale). L'unico errore è * "L'effetto netto è che window.doTheMove viene chiamato." *. Poiché 'init' è passato a' addEventListener', viene effettivamente chiamato dal contesto dell'elemento 'animBtn' così' this.doTheMove() 'è effettivamente' animBtn.doTheMove() '. Ancora una volta, il risultato finale è lo stesso. Solo un piccolo dettaglio – user113716
@patrickdw Grazie non ero sicuro se 'this' è stato trasmesso come oggetto DOM o oggetto Window. Non mi sono preoccupato di provarlo per confermare. Mi aspettavo tanto. – Raynos
+1 E per essere onesti, la tua valutazione di 'this' sarebbe stata corretta se fosse stato utilizzato' attachEvent' di Microsoft poiché non ha (per qualche motivo) impostato il contesto del gestore. – user113716