使用原始上下文调用具有未知数量参数的Javascript函数

时间:2011-10-05 01:18:37

标签: javascript functional-programming

我目前正在使用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的行为 - 改变函数执行的上下文。

2 个答案:

答案 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
在这种情况下,您将获得一个“绑定”到原始上下文的函数