订阅发布这段是代码的作者的原本想法到底是啥?_基于MVC的JavaScript Web富应用开发书评-查字典图书网
查字典图书网
当前位置: 查字典 > 图书网 > 互联网 > 基于MVC的JavaScript Web富应用开发 > 订阅发布这段是代码的作者的原本想法到底是啥?
隔壁老王 基于MVC的JavaScript Web富应用开发 的书评 发表时间:2015-04-01 23:04:21

订阅发布这段是代码的作者的原本想法到底是啥?

第二章订阅和发布
publish: function () {
   ...
   // 如果不存在_callbacks 方法返回
   if(!(this._calls = this._callbacks )) return this;
   
   //如果不包含事件对应的数组
   if(!(this._calls = this._callbacks[ev])) return this;
   ...
}
这个地方我觉得有个很严重的错误
因为在上部分subscribe (不在这里贴可在书中查看)方法中 _callbacks 方法不存在,在会被指定为{} 。
所以subscribe 这个方法哪怕只执行一次, 第一个if 永远都是返回true (比如subscribe 中根本没声明过的 “no.func”方法,subscribe 只要之前执行subscribe("yes.func",function() { 这里是yes方法 })过,publish("no.func") 执行时都不会被正确的return 出来)
 
第二个if 也有问题 因为上部分的subscribe 方法中 _callbacks[ev] 永远都被赋值成一个数组,在callback 方法未传入的时候。
数组会被推入一个undefined,
那么到 !(this._calls = this._callbacks[ev])这里 相当于 !(this._calls = [undefined]) 也相当于 !([]) 这个判断也是只要sub方法执行过,永远为false 了
完全打不到判断的预期啊?

展开全文
有用 0 无用 0

您对该书评有什么想说的?

发 表

推荐文章

猜你喜欢

附近的人在看

推荐阅读

拓展阅读

对“订阅发布这段是代码的作者的原本想法到底是啥?”的回应

隔壁老王 2016-07-24 23:58:27

// 简单订阅发布模式 ---摘至javascript 设计模式开发实践
function PubSub () {
this.handles = {}
}
PubSub.prototype.on = function (eventType,handler) {
if(!(eventType in this.handles)) {
this.handles[eventType] =[]
}
this.handles[eventType].push(handler);
};
PubSub.prototype.emit = function (eventType) {
var handlerArgs = Array.prototype.slice.call(arguments,1);
for( var i =0; i<this.handles[eventType].length; i++) {
this.handles[eventType][i].apply(this,handlerArgs);
}
};