惰性载入函数

定义

我们先看下面的例子:在 DOM 事件开发中,我们会遇到浏览器兼容问题,这时需要进行一次环境的判断。

// 简化写法
function addEvent (type, el, fn) {
    if (window.addEventListener) {
        el.addEventListener(type, fn, false)
    } else if (window.attachEvent) {
        el.attachEvent('on' + type, fn)
    }
}

如果用户使用的浏览器支持内置的 addEventListener,那么它就一直支持了,那么这种判断就变得没必要了。 即使只有一个 if 语句的代码,也肯定比没有 if 语句的慢,所以如果 if 语句不必每次执行,那么代码可以运行地更快一些。解决方案就是惰性载入的技巧。

惰性载入表示函数执行的分支仅会执行一次。下面介绍两种惰性载入的方式。

优化

第一种就是在函数被调用时再处理函数。在第一次调用的过程中,该函数会被覆盖为另外一个按合适方式执行的函数,这样任何对原函数的调用都不用再经过执行的分支了。

function addEvent (type, el, fn) {
    if (window.addEventListener) {
        addEvent = function (type, el, fn) {
            el.addEventListener(type, fn, false)
        }
    } else if (window.attachEvent) {
        addEvent = function (type, el, fn) {
            el.attachEvent('on' + type, fn)
        }
    }
}

第二种就是使用闭包的形式。

var addEvent = (function () {
    if (window.addEventListener) {
        return function (type, el, fn) {
            el.addEventListener(type, fn, false)
        }
    } else if (window.attachEvent) {
        return function (type, el, fn) {
            el.attachEvent('on' + type, fn)
        }
    }
})()

参考文献