Проблема здесь в том, что вы отсоединяете метод closeMenu от его объекта. У вас возникла бы такая же проблема, если бы вы сделали это:
var closeMenu = myObj.closeMenu; // detaching the method from the object
closeMenu();
Отключение и вызов таких методов означает, что они больше не применяются к объектам, на которых они были созданы. В вашем примере вы делаете почти то же самое:
// Setting the first parameter of setTimeout to be the detached closeMenu method
that.timer = setTimeout(that.closeMenu,500);
Исправление для первого метода состояло бы в использовании call
или apply
методов:
var closeMenu = myObj.closeMenu; // detaching the method from the object
closeMenu.apply(myObj);
Но это не сработает для таймера. Вместо этого создайте анонимную функцию:
that.timer = setTimeout(function () { that.closeMenu(); },500);
<ч />
Также стоит упомянуть bind()
- его не следует путать с $('#selector').bind()
в jQuery - методом, который использовался в различных блогах и в некоторых библиотеках (Prototype является наиболее заметным) уже давно и, наконец, был реализован в ECMAScript edition 5 .
that.timer = setTimeout(that.closeMenu.bind(that),500);
Я использую аналогичный метод в одном или двух созданных мною классах, потому что он просто облегчает задачу.