在C#中,事件和委托是模块解耦的手段。在javascript中呢?
一个采用发布/订阅模式实现事件驱动的库。
发布/订阅模式是一种消息模式,
参与着:发布者、订阅者。
var PubSub={
subscribe:function(ev,callback){
//创建 _callback 对象,除非她已经存在
var call=this._callback||(this._callback={});
//针对给定的事件Key创建一个数组,除非这个数组已经存在
//然后将回调函数追加到这个数组中
(this._callback[ev]||(this._callback[ev]=[])).push(callback);
returnthis;
},
publish:function(){
//将arguments对象转换为真正的数组
var args=Array.prototype.slice.call(arguments,0);
//拿出第1个参数,即事件的名称
var ev=args.shift();
//如果不存在 _callback对象,则返回
//或者如果不包含给定事件对应的数组
var list,calls,i,l;
if(!(calls=this._callback)) returnthis;
if(!(list=this._callback[ev])) returnthis;
//触发回调
for(i=o,l=list.length;i<l;i++)
list[i].apply(this,args);
returnthis;
}
};
//使用方法,事件名称可以采用命名空间的方式来管理,例如使用冒号(:)分隔符
PubSub.subscribe("user:create",function(){/* ... */});
PubSub.publish("user:create");
//这时候PubSub是全局变量,可以应用于全局事件。我们也可以很容易的将其应用于局部事件。
//如下
var Asset={};
//添加PubSub
jQuery.extend(Asset,PubSub);
//现在就可以用publish/subcribe函数了
Asset.subscribe("create",function(){/* ... */});