利用函数的惰性载入提高javascript代码性能 转
来源:互联网 发布:启动股票池 板块数据 编辑:程序博客网 时间:2024/05/16 07:07
在 javascript 代码中,因为各浏览器之间的行为的差异,我们经常会在函数中包含了大量的 if
语句,以检查浏览器特性,解决不同浏览器的兼容问题。 例如,我们最常见的为 dom
节点添加事件的函数:
function addEvent (type, element, fun) { if (element.addEventListener) { element.addEventListener(type, fun, false); } else if(element.attachEvent){ element.attachEvent('on' + type, fun); } else{ element['on' + type] = fun; }}
每次调用 addEvent
函数的时候,它都要对浏览器所支持的能力进行检查,首先检查是否支持addEventListener
方法,如果不支持,再检查是否支持 attachEvent
方法,如果还不支持,就用 dom 0 级的方法添加事件。 这个过程,在 addEvent
函数每次调用的时候都要走一遍,其实,如果浏览器支持其中的一种方法,那么他就会一直支持了,就没有必要再进行其他分支的检测了, 也就是说,if
语句不必每次都执行,代码可以运行的更快一些。
解决的方案就是称之为惰性载入的技巧。
所谓惰性载入,就是说函数的if分支只会执行一次,之后调用函数时,直接进入所支持的分支代码。 有两种实现惰性载入的方式,第一种事函数在第一次调用时,对函数本身进行二次处理,该函数会被覆盖为符合分支条件的函数,这样对原函数的调用就不用再经过执行的分支了, 我们可以用下面的方式使用惰性载入重写 addEvent()
。
function addEvent (type, element, fun) { if (element.addEventListener) { addEvent = function (type, element, fun) { element.addEventListener(type, fun, false); } } else if(element.attachEvent){ addEvent = function (type, element, fun) { element.attachEvent('on' + type, fun); } } else{ addEvent = function (type, element, fun) { element['on' + type] = fun; } } return addEvent(type, element, fun);}
在这个惰性载入的 addEvent()
中,if
语句的每个分支都会为 addEvent
变量赋值,有效覆盖了原函数。 最后一步便是调用了新赋函数。下一次调用 addEvent()
的时候,便会直接调用新赋值的函数,这样就不用再执行if
语句了。
第二种实现惰性载入的方式是在声明函数时就指定适当的函数。 这样在第一次调用函数时就不会损失性能了,只在代码加载时会损失一点性能。 一下就是按照这一思路重写的 addEvent()
。
var addEvent = (function () { if (document.addEventListener) { return function (type, element, fun) { element.addEventListener(type, fun, false); } } else if (document.attachEvent) { return function (type, element, fun) { element.attachEvent('on' + type, fun); } } else { return function (type, element, fun) { element['on' + type] = fun; } }})();
这个例子中使用的技巧是创建一个匿名的自执行函数,通过不同的分支以确定应该使用那个函数实现,实际的逻辑都一样, 不一样的地方就是使用了函数表达式(使用了 var
定义函数)和新增了一个匿名函数,另外每个分支都返回一个正确的函数,并立即将其赋值给变量 addEvent
。
惰性载入函数的优点只执行一次 if
分支,避免了函数每次执行时候都要执行 if
分支和不必要的代码,因此提升了代码性能,至于那种方式更合适,就要看您的需求而定了。
注
本文为转载文章,原文:“利用函数的惰性载入提高javascript代码性能”
原文:http://yanhaijing.com/javascript/2013/10/16/%E5%88%A9%E7%94%A8%E5%87%BD%E6%95%B0%E7%9A%84%E6%83%B0%E6%80%A7%E8%BD%BD%E5%85%A5%E6%8F%90%E9%AB%98javascript%E4%BB%A3%E7%A0%81%E6%80%A7%E8%83%BD/
- 利用函数的惰性载入提高javascript代码性能 转
- 利用函数的惰性载入提高 javascript 代码性能
- 利用函数的惰性载入提高javascript代码性能
- JavaScript 惰性载入函数
- JavaScript 函数惰性载入
- JavaScript 函数惰性载入
- JavaScript函数惰性载入
- JavaScript 惰性载入函数
- JavaScript惰性载入函数
- javascript中惰性载入函数
- 代码优化--惰性载入函数
- JavaScript-编程技巧-惰性载入函数
- JavaScript-JS优化与惰性载入函数
- 惰性载入函数的使用--验证
- js惰性载入-性能-滚轮事件
- JavaScript基础----42JavaScript惰性函数(没写代码)
- 惰性载入
- javaScript函数惰性加载
- HTTP协议分析(待)
- 安装win7的时候出现“安装程序无法创建新的系统分区 也无法定位系统分区”
- 使用console.table()调试javascript
- JavaSE06_常用类之StringBuffer
- bq24040中文数据手册综述
- 利用函数的惰性载入提高javascript代码性能 转
- 静态方法和实例方法的区别
- Netty Server端代码简略分析
- JavaSE06_常用类之String
- fghnxrtghnxrthrth
- JavaSE06_常用类之StringBuilder
- HDU 2732 最大流 拆点
- 关于字典序列问题的一个脑洞->>
- JavaSE06_常用类之String StringBuffer StringBuilder比较