惰性加载函数
在 Web 开发中,因为浏览器之间的实现差异,一些嗅探工作总是不可避免。比如我们需要 一个在各个浏览器中能够通用的事件绑定函数 addEvent
常见写法 一
var addEvent = function(elem, type, handler) {
if (window.addEventListener) {
return elem.addEventListener(type, handler, false);
} else if (window.attachEvent) {
elem.attachEvent("on" + type, handler);
}
};
常见写法 二
//在代码加载的时候就立刻进行一次判断,以便让 addEvent2 返回一个包裹了正确逻辑的函数,目前的 addEvent
//函数依然有个缺点,也许我们从头到尾都没有使用过 addEvent2 函数,这样看来,前一次的浏览器嗅探就是完全
//多余的操作,而且这也会稍稍延长页面 ready的时间
var addEvent2 = (function() {
if (window.addEventListener) {
return function(elem, type, handler) {
elem.addEventListener(type, handler, false);
}
} else if (window.attachEvent) {
return function(elem, tye, handler) {
elem.attachEvent("on" + type, handler);
}
}
})();
常见写法 三 ( 惰性载入函数方案 )
//惰性载入函数方案,第一次进入条件分支之后,在函数内部会重写这个函数,
//重写之后的函数就是我们期望的 addEvent 函数,在下一次进入 addEvent3
//函数的时候, addEvent3函数里不再存在条件分支语句
var addEvent3=function(){
if(window.addEventListener){
addEvent3=function(elem,type,handler){
elem.addEventListener(type,handler,false);
}
}else if(window.attchEvent){
addEvent3=function(elem,type,handler){
elem.attachEvent("on"+type,handler);
}
}
}
函数反柯里化(uncurring)
反curring就是把原来已经固定的参数或者this上下文等当作参数延迟到未来传递.
Function.prototype.uncurring=function(){
var self=this;//只调用这个方法的函数对象
return function(){
var obj=Array.prototype.shift.call(arguments);
return self.apply(obj,arguments);
}
}
var push=Array.prototype.push.uncurring();
(function(){
push(arguments,4);
console.log(arguments);
})(1,2,3);