无法理解Observer模式中的一些代码

时间:2016-07-27 02:53:32

标签: observer-pattern

这是代码:

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?如果你能回答我的问题,我将非常感谢。

1 个答案:

答案 0 :(得分:0)

您可以考虑询问此代码的作者,而不是将其作为互联网上随机用户的问题。然而,这是我稍微受过教育的猜测,为什么作者选择了她所做的习语:

  • 为什么var key=Array.prototype.shift.call(arguments);而不是传入参数?:她没有明确定义哪些参数进入并传递给观察函数,所以她可以接受并传递任意数字论点。她只要求第一个参数是应该调用哪组函数的关键。这是Currying
  • 的一种形式
  • [为什么] fns&&(fns.length=0)而不是fns.length=0 :如果fnsundefined或其他方面是假的,那么问它是不是很糟糕有一个财产。通过在引用潜在属性之前检查它是否真实,作者正在避免ReferenceError。这是Short-circuit evaluation
  • 的一种形式