2011-10-05 11 views
6

私は現在、Function.applyを使用して動的な引数を持つ関数を呼び出していますが、元のコンテキストにアクセスすることはできません。自分自身で文脈を設定する私が望むのは、可変数の引数を持つ関数を呼び出して、元のコンテキストを保持できることです。元のコンテキストで未知数の引数を使用してJavascript関数を呼び出す

おそらくいくつかのコードは、私が何をしようとしているあなたが表示されるはずです:

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の動作なし - 変更関数が実行されるコンテキスト。

答えて

5

関数の「元のコンテキスト」はありません。あなたは、このような何かしなければならないでしょう:

subscribe: function(handler, context) { 
    if (typeof(handler) === 'function') { 
     handlers.push([handler, context]); 
    } 
}, 

をそして、もちろん、また

handlers[handler][0].apply(handlers[handler][1], args); 

は(これは私が何をするのかである)、ハンドラが持っていることを確認するために、発信者に任せます正しい文脈。たとえば、代わりに delegate.subscribe(this.foo)の、それは .bindが事件を解決することを、だろうか?

var self = this 
delegate.subscribe(function() { self.foo() }) 

あるいは、Function.prototype.bind

delegate.subscribe(this.foo.bind(this)) 
+0

に「バインドさ」関数を取得するには、BACKBONE.JSはそのイベントバインディング・フレームワークではまったく同じものです:http://documentcloud.github.com /backbone/docs/backbone.html#section-12 – nrabinowitz

+0

@nrabinowitz Haha! GMTA :) –

+0

あなたは、 'var self'メソッドなどを使って、呼び出し元が実行されるコンテキストを世話することができると思います。そうすれば、私は「これ」のためのより適切なオブジェクトを提供することができます。 –

関連する問題