一部の 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) オブジェクトを含む Client クラスを作成しています。クライアント オブジェクト自体を介してソケットのイベント リスナーを公開しています。
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
と本質的に同じカスタムの一意の識別子プロパティであることに注意してください。