高阶函数应用5——惰性加载函数

在 Web 开发中,因为浏览器之间的实现差异,一些嗅探工作总是不可避免。比如我们需要一个在各个浏览器中能够通用的事件绑定函数 addEvent,常见的写法如下:

var addEvent = function( elem, type, handler ){
 if ( window.addEventListener ){
 return elem.addEventListener( type, handler, false ); 
  }
 if ( window.attachEvent ){
 return elem.attachEvent( 'on' + type, handler );
 }
}; 

这个函数的缺点是,当它每次被调用的时候都会执行里面的 if 条件分支,虽然执行这些 if分支的开销不算大,但也许有一些方法可以让程序避免这些重复的执行过程。

第二种方案是这样,我们把嗅探浏览器的操作提前到代码加载的时候,在代码加载的时候就立刻进行一次判断,以便让 addEvent 返回一个包裹了正确逻辑的函数。代码如下:

var addEvent = (function(){
 if ( window.addEventListener ){
 return function( elem, type, handler ){
 elem.addEventListener( type, handler, false );
 }
 }
 if ( window.attachEvent ){
 return function( elem, type, handler ){
 elem.attachEvent( 'on' + type, handler );
 }
 }
})(); 

目前的 addEvent 函数依然有个缺点,也许我们从头到尾都没有使用过 addEvent 函数,这样看来,前一次的浏览器嗅探就是完全多余的操作,而且这也会稍稍延长页面 ready 的时间。

第三种方案即是我们将要讨论的惰性载入函数方案。此时 addEvent 依然被声明为一个普通函数,在函数里依然有一些分支判断。但是在第一次进入条件分支之后,在函数内部会重写这个函数,重写之后的函数就是我们期望的 addEvent 函数,在下一次进入 addEvent 函数的时候,addEvent函数里不再存在条件分支语句:

<html>
 <body>
 <div id="div1">点我绑定事件</div>
 <script>
 var addEvent = function( elem, type, handler ){
 if ( window.addEventListener ){
 addEvent = function( elem, type, handler ){
 elem.addEventListener( type, handler, false );
 }
 }else if ( window.attachEvent ){
 addEvent = function( elem, type, handler ){
 elem.attachEvent( 'on' + type, handler );
 }
 }
 addEvent( elem, type, handler );
 }; 
 var div = document.getElementById( 'div1' );
 addEvent( div, 'click', function(){
 alert (1);
 });
 addEvent( div, 'click', function(){
 alert (2);
 });
 </script>
 </body>
</html> 

至此,高阶函数五个应用就介绍完毕,感谢《JavaScript设计模式与开发实践》这本书以及作者的有关介绍。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值