Добро пожаловать в мир JavaScript! : D
Вы попали в сферу охвата и закрытия javascript.
Для краткого ответа:
this.bar()
выполняется в рамках foo , (как это относится к foo )
var barf = this.bar;
barf();
выполняется в глобальной области.
this.bar в основном означает:
выполнить функцию, указанную this.bar, в области действия this (foo).
Когда вы скопировали this.bar в barf, запустите barf. Javascript, понимаемый как, запускает функцию, указанную barf, и поскольку this не существует, он просто запускается в глобальной области видимости.
Чтобы исправить это, вы можете изменить
barf();
примерно так:
barf.apply(this);
Это говорит Javascript привязать область действия this к barf перед его выполнением.
Для событий jquery вам нужно будет использовать анонимную функцию или расширить функцию привязки в прототипе для поддержки области видимости.
Для получения дополнительной информации: