Не существует такого понятия, как «исходный контекст» функции. Вы должны сделать что-то вроде этого:
subscribe: function(handler, context) {
if (typeof(handler) === 'function') {
handlers.push([handler, context]);
}
},
А потом, конечно,
handlers[handler][0].apply(handlers[handler][1], args);
В качестве альтернативы (это то, что я бы сделал), оставьте это вызывающей стороне, чтобы убедиться, что обработчик имеет правильный контекст. Например, вместо delegate.subscribe(this.foo)
, скажем
var self = this
delegate.subscribe(function () { self.foo() })
Или, используя Function.prototype.bind ,
delegate.subscribe(this.foo.bind(this))