我目前正在使用Function.apply来调用具有动态数量的参数的函数,但是我无法访问原始上下文,并且不希望自己设置上下文。我想要的是能够调用具有可变数量的参数的函数,保持原始上下文。
也许某些代码应该向您展示我正在尝试做的事情:
function MulticastDelegate() {
var handlers = [];
this.event = {
subscribe: function(handler) {
if (typeof(handler) === 'function') {
handlers.push(handler);
}
},
unsubscribe: function(handler) {
if (typeof(handler) === 'function') {
handlers.splice(handlers.indexOf(handler),1);
}
}
}
this.execute = function() {
var args = Array.prototype.slice.call(arguments);
for (var handler in handlers) {
// call this with the original context of the handler
handlers[handler].apply(null, args);
}
}
}
基本上,我想要apply
的行为 - 传递参数数组的能力 - 没有call
的行为 - 改变函数执行的上下文。
答案 0 :(得分:5)
没有函数的“原始上下文”这样的东西。你必须做这样的事情:
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))
答案 1 :(得分:0)
可能是.bind
会解决这个问题吗?
http://documentcloud.github.com/underscore/#bind
在这种情况下,您将获得一个“绑定”到原始上下文的函数