в отличие от некоторых других языков, «this» в javascript является динамическим, то есть «this» - это контекст, в котором была вызвана функция, а не где был определен.
function Foo() {
this.x = 1;
this.func = function() { alert(this.x) }
}
foo = new Foo
foo.func() // works
var copy = foo.func
copy() // nope, because func() lost its context
чтобы создать связь между функцией и ее контекстом, вы должны «заблокировать» контекст в замыкании. Большинство фреймворков предоставляют сахар для этого в виде метода bind (), который в упрощенном виде выглядит следующим образом
Function.prototype.bind = function(o) {
var p = this;
return function() { p.apply(o) }
}
с заблокированным назначением контекстной функции работает как ожидалось
bar = foo.func.bind(foo)
bar() // yes!