объяснение того, что происходит. Ответ Пойнти хорош, но я хочу объяснить это более обобщенно. Очень хорошее исследование по this
можно найти здесь
Обработчик событий - это просто обратный вызов. Вы передаете ему функцию и событие для прослушивания. Все, что он сделает, - это вызов этой функции.
Animation.init - просто метод получения этой функции. Думайте об этом так:
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();
}
Итак, все, что вы сделали, передается в
var callback = function(){
this.doTheMove(); // I'm calling the function here, but it gives an error.
}
По умолчанию в javascript this === window
. Это будет ссылаться на глобальный объект, если он не установлен на что-то. Чистый эффект заключается в том, что window.doTheMove
называется. И эта функция не существует.
В этом случае, поскольку callback
фактически вызывается обработчиком события, объект this
указывает на объект DOM, который вызвал событие, поэтому ваш вызов node.doTheMove
, который все еще не существует.
То, что вы хотели сделать, это обернуть его ссылкой на анимацию.
var callback = function() {
Animation.init();
}
Это функция, выполняющая init
в Animation
. Когда вы выполняете его на подобном объекте, то внутри this === Animation
, как и следовало ожидать.
Подводя итог. Проблема в том, что Animation.init
- это просто ссылка на функцию. У него нет информации ни о чем другом, как упоминал Пойнти.