2011-09-15 110 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類中另一個有用的方法是this.getTarget()