这是代码:
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 :(得分:0)
您可以考虑询问此代码的作者,而不是将其作为互联网上随机用户的问题。然而,这是我稍微受过教育的猜测,为什么作者选择了她所做的习语:
var key=Array.prototype.shift.call(arguments);
而不是传入参数?:她没有明确定义哪些参数进入并传递给观察函数,所以她可以接受并传递任意数字论点。她只要求第一个参数是应该调用哪组函数的关键。这是Currying。fns&&(fns.length=0)
而不是fns.length=0
:如果fns
是undefined
或其他方面是假的,那么问它是不是很糟糕有一个财产。通过在引用潜在属性之前检查它是否真实,作者正在避免ReferenceError
。这是Short-circuit evaluation