2016-07-27 70 views
0

这是代码的一些代码:看不惯Observer模式

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

+0

一种形式,你可以查看更多... HTTP://stackoverflow.com/questions/3358622/observer-design-pattern-vs-listeners RQ = 1 –

回答

0

你可能会考虑询问这个代码的作者,而不是把它作为一个问题给随机的人在互联网上。但是,这里有我稍微的猜测,为什么笔者选择了她做的成语:

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

的代码是从本书,很难联系作者。感谢您的回答。 –

+0

您说'作者正在避免ReferenceError',但在它之前'if(!fns){0}返回false; }'已经检查过fns是否未定义 –

+0

嘿,我从来没有说过作者是一致的或理智的。这绝对是作者的一个问题。 – Will