2016-07-27 71 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