无法理解观察者模式中的一些代码

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:如果 fnsundefined 或其他错误,那么问它是否有属性是不好的。通过在引用潜在属性之前检查它是否真实,作者避免了ReferenceError。这是Short-circuit evaluation 的一种形式

【讨论】:

代码来自一本书,很难联系到作者。谢谢你的回答。 你说the author is avoiding a ReferenceError,但之前if(!fns) return false; 已经检查过fns是否未定义 嘿,我从来没有说过作者是一贯的或理智的。这绝对是作者的问题。

以上是关于无法理解观察者模式中的一些代码的主要内容,如果未能解决你的问题,请参考以下文章

Android中观察者模式的升入理解

php设计模式之观察者模式实例代码

Java设计模式学习笔记(观察者模式)

观察者模式深入实践

如何理解这6种常见设计模式?

Java设计模式-观察者模式