2011-09-15 11 views
2

イベントサブスクリプションとして機能する関数のリストがある場合は、それらを実行して.call()(下のB)、またはより直接的に(A)で呼び出す利点がありますか?コードは以下の通りです。私が見ることのできる唯一の違いは.callで、thisがどのように設定されているかを制御できることです。それ以外に他の違いはありますか?Javascriptでイベントを作成する

$(function() { 
     eventRaiser.subscribe(function() { alert("Hello"); }); 
     eventRaiser.subscribe(function(dt) { alert(dt.toString()); }); 

     eventRaiser.DoIt(); 
    }); 

    var eventRaiser = new (function() { 
     var events = []; 
     this.subscribe = function(func) { 
      events.push(func); 
     }; 

     this.DoIt = function() { 
      var now = new Date(); 
      alert("Doing Something Useful"); 
      for (var i = 0; i < events.length; i++) { 
       events[i](now); //A 
       events[i].call(this, now); //B 
      } 
     }; 
    })(); 

答えて

3

いいえ、それ以外の違いはありません。あなたがが第二のアプローチに従った場合は、「クライアント」は、使用するコンテキストを指定することができるように、あなたはsubscribeを拡張することができます。

this.subscribe = function(func, context) { 
    events.push({func: func, context: context || this}); 
}; 

this.DoIt = function() { 
    var now = new Date(); 
    alert("Doing Something Useful"); 
    for (var i = 0; i < events.length; i++) { 
     events[i].func.call(events[i].context, now); 
    } 
}; 
+0

これはすばらしい答えです...ありがとうございます! –

+0

あなたは大歓迎です:) –

1

あなたは方法Bで行くことに決めた場合は、サブスクライブ機能を許可することができますイベント、イベント特有の機能を実行する。

たとえば、日付をパラメータとして渡す代わりに、this.getDate()を関数内に使用することができます(メソッドを作成する必要があります)。 Eventクラス内のもう1つの便利なメソッドはthis.getTarget()です。

関連する問題