在一些 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's original context>, args);
}
编辑:添加有关我的具体问题的更多详细信息。我正在创建一个客户端类,其中包含一个套接字(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'S 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
基本相同。