Другие ответы здесь также верны.Предоставление моей точки зрения здесь на случай, если это поможет.
Ключ к пониманию того, почему код не ведет себя так, как вы ожидаете, требует понимания того, как this
работает в JavaScript.Проблема в том, что this
зависит от того, как вызывается функция.
Во-первых, если вы вызываете функцию в стиле метода, this
- это то, что вы ожидаете:
mySingleton.mouseHandler(); // this === mySingleton
Если вы присоединяете функцию к чему-то esle, это тоже работает.
var anotherSingleton = {};
anotherSingleton.foo = mySingleton.mouseHandler;
anotherSingleton.foo(); // this === anotherSingleton
Если вы отсоединяете функцию, this
становится объектом глобальной области (window
)
var foo = mySingleton.mouseHandler;
foo(); // this === window
И, наконец, вы можете заставить this
быть чем-то другим, используя call
или apply
:
var randomThingy = {};
mySingleton.mouseHandler.call(randomThingy); // this === randomThingy
. Вывод заключается в том, что this
определяется во время выполнения в зависимости отфункция была вызвана.Часто фреймворки, которые позволяют вам делать «классы», абстрагируют эти детали от вас, неявно применяя шаблон связывания от вашего имени.Вот почему он работал, и больше не работает.
Как уже упоминали другие, вы можете изменить свой обработчик так, чтобы он ссылался на переменную по ее имени в области (mySingleton
) или связывал ее иным образом, как обсуждалось.
Вот статья, которую я написал на эту тему несколько лет назад и которая более детально описана: http://trephine.org/t/index.php?title=Understanding_JavaScript%27s_this_keyword
Надеюсь, это поможет!