无法理解观察者模式中的一些代码
Posted
技术标签:
【中文标题】无法理解观察者模式中的一些代码【英文标题】:could not understand some codes in Observer pattern 【发布时间】:2016-11-30 20:55:15 【问题描述】:这是代码:
var Event=(function()
var clientList=,listen,trigger,remove;
listen=function(key,fn)
/*some code*/
;
trigger:function()
var key=Array.prototype.shift.call(arguments);
fns=clientList[key];
if(!fns||fns.length==0)
return false;
for(var i=0,fn;fn=fns[i++];)
fn.apply(this,arguments);
;
remove:function(key,fn)
var fns=clientList[key];
if(!fns)
return false;
if(!fn)
fns&&(fns.length=0)
else
for(var l=fns.length-1;l>=0;l--)
var _fn=fns[l];
if(_fn===fn)
fns.splice(1,1);
;
/*some code*/
)();
我不明白为什么用var key=Array.prototype.shift.call(arguments);
而不是传递参数和fns&&(fns.length=0)
而不是fns.length=0
?如果您能回答我的问题,我将不胜感激。
【问题讨论】:
你可以在这里查看更多...***.com/questions/3358622/… 【参考方案1】:您可以考虑询问此代码的作者,而不是向 Internet 上的随机人员提出问题。但是,对于作者为什么选择她所做的成语,以下是我稍微有根据的猜测:
为什么var key=Array.prototype.shift.call(arguments);
不传递参数?:她没有明确定义传入和传递给观察函数的参数,因此她可以接受和传递任意数量的参数。她只要求第一个参数是应该调用哪组函数的键。这是Currying 的一种形式。
[Why] fns&&(fns.length=0)
而不是 fns.length=0
:如果 fns
是 undefined
或其他错误,那么问它是否有属性是不好的。通过在引用潜在属性之前检查它是否真实,作者避免了ReferenceError
。这是Short-circuit evaluation 的一种形式
【讨论】:
代码来自一本书,很难联系到作者。谢谢你的回答。 你说the author is avoiding a ReferenceError
,但之前if(!fns) return false;
已经检查过fns是否未定义
嘿,我从来没有说过作者是一贯的或理智的。这绝对是作者的问题。以上是关于无法理解观察者模式中的一些代码的主要内容,如果未能解决你的问题,请参考以下文章