В некотором Javascript-коде (node.js конкретно) мне нужно вызвать функцию с неизвестным набором аргументов без изменения контекста. Например:
function fn() {
var args = Array.prototype.slice.call(arguments);
otherFn.apply(this, args);
}
Проблема в том, что когда я вызываю apply
, я меняю контекст, передавая this
в качестве первого аргумента. Я хотел бы передать args
функции, называемой без, изменяющей контекст вызываемой функции. Я действительно хочу это сделать:
function fn() {
var args = Array.prototype.slice.call(arguments);
otherFn.apply(<otherFn original context>, args);
}
Изменить: Добавление более подробной информации о моем конкретном вопросе. Я создаю класс Client, содержащий объект socket (socket.io) среди других сведений, относящихся к соединению. Я подвергаю прослушиватели событий сокета через сам клиентский объект.
class Client
constructor: (socket) ->
@socket = socket
@avatar = socket.handshake.avatar
@listeners = {}
addListener: (name, handler) ->
@listeners[name] ||= {}
@listeners[name][handler.clientListenerId] = wrapper = =>
# append client object as the first argument before passing to handler
args = Array.prototype.slice.call(arguments)
args.unshift(this)
handler.apply(this, args) # <---- HANDLER CONTEXT IS CHANGING HERE :(
@socket.addListener(name, wrapper)
removeListener: (name, handler) ->
try
obj = @listeners[name]
@socket.removeListener(obj[handler.clientListenerId])
delete obj[handler.clientListenerId]
Обратите внимание, что clientListenerId
- это свойство уникального уникального идентификатора, которое по существу совпадает с ответом, найденным здесь.