利用函数的惰性载入提高javascript代码性能

转载 2016年05月30日 13:55:49


在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 惰性载入函数

在JavaScript代码中,由于浏览器之间行为的差异,多数JavaScript代码包含了大量的if语句,以检查浏览器特性,解决不同浏览器的兼容问题。例如添加事件的函数: function addE...

javascript中惰性载入函数

javascript中惰性载入函数 在这本书中看到的,在此做一下记录, 感觉还是很有用的. 就从大家都知道的创建xhr对象方法说起 我们都知道如果创建一个xhr对象(不会写,不怕,有百度,嘿嘿) ...

JavaScript-JS优化与惰性载入函数

惰性载入函数 由于现在浏览器之间的差异,为了实现跨浏览器工作,很多函数要书写大量if语句或者try…catch…语句。当每次调用函数时,都要对每个if分支或try语句进行检查,这样会使得浏览器反应变...

JavaScript惰性载入函数

因为各大浏览器所使用的JS引擎不同,所以在实现某一个功能时都或多或少的存在差异,导致在写代码时要针对每一个功能给出兼容浏览器的不同实现方式,这样在运行代码时就会造成性能的损耗。所以就出现了惰性载入函数...

代码优化--惰性载入函数

有一句话说的好,没有if的语句,比有if的语句,拥有更高的性能,虽然,这种性能的差距,是非常小的,还有一句话呢,说的更好,不积跬步,无以至千里,不积小流,无以成江河,所以呢,如果可以大规模的减小这种i...

javascript惰性函数

惰性函数有些地方也叫作自定义函数。做法是创建一个新函数并且将其分配保存了另外函数的同一个变量,那么就以一个新函数覆盖了就函数。在某种程度上,回收了旧函数指针以指向一个新函数。而这一切发生在就函数体的内...

学习Javascript:掌握惰性函数定义模式

这篇文章阐述的是一种函数式编程(functional-programming)设计模式,我称之为惰性函数定义(Lazy Function Definition)。我不止一次发现这种模式在JavaScr...

javaScript函数惰性加载

什么是JavaScirpt函数惰性加载? 表示函数执行的分支只会在函数第一次调用时的时候执行,在第一次调用过程中,该函数会被覆盖按照合适方式执行的函数,这样任何对原函数的调用就不用再经过执行的分支了。...

惰性载入函数的使用--验证

介绍惰性载入函数一种常见的使用

javascript笔记:通过对作用域链和执行环境的深入理解所得出的提高javascript代码性能的建议

http://www.cnblogs.com/sharpxiajun/archive/2011/12/10/2283126.html Javascript里的作用域到底决定了什么呢?作用域决...
  • kopolwu
  • kopolwu
  • 2011年12月10日 15:41
  • 216
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用函数的惰性载入提高javascript代码性能
举报原因:
原因补充:

(最多只允许输入30个字)