在一些Javascript代碼(特別是node.js)中,我需要調用帶有未知參數集的函數而不更改上下文。例如:是否可以在不改變上下文的情況下調用function.apply?
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);
}
編輯:添加關於我的具體問題的更多細節。我正在創建一個Client類,其中包含有關連接的其他信息的套接字(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
是一個自定義的唯一標識符的屬性,本質上是一樣的the answer found here。
你問的是如何獲得對全局上下文的引用嗎? – SLaks
你有沒有試過把第一個參數留空?只要它不是必需的論點,那就應該有效。 –
@SLaks - no,因爲'otherFn'將屬於另一個對象,但是該對象將根據何時調用'fn'而有所不同。 –