Вызов функции Javascript с неизвестным количеством аргументов в исходном контексте. - PullRequest
6 голосов
/ 05 октября 2011

В настоящее время я использую 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 ]

5 голосов
/ 05 октября 2011

Не существует такого понятия, как «исходный контекст» функции. Вы должны сделать что-то вроде этого:

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))
0 голосов
/ 05 октября 2011

Может ли быть, что .bind решит дело?http://documentcloud.github.com/underscore/#bind
В этом случае вы получаете функцию, «привязанную» к исходному контексту

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...