【问题标题】: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?如果您能回答我的问题,我将不胜感激。

【问题讨论】:

标签: observer-pattern


【解决方案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是否未定义
  • 嘿,我从来没有说过作者是一贯的或理智的。这绝对是作者的问题。
猜你喜欢
  • 1970-01-01
  • 2016-02-20
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多