美文网首页让前端飞
『JavaScript专题』之惰性函数

『JavaScript专题』之惰性函数

作者: Vicky丶Amor | 来源:发表于2019-03-06 11:03 被阅读1次

需求

我们现在需要写一个 foo 函数,这个函数返回首次调用时的 Date 对象,注意是首次。

解决一:普通方法

var t;
function foo() {
    if (t) return t;
    t = new Date()
    return t;
}

问题有两个,一是污染了全局变量,二是每次调用 foo 的时候都需要进行一次判断。

解决二:闭包

我们很容易想到用闭包避免污染全局变量。

var foo = (function() {
    var t;
    return function() {
        if (t) return t;
        t = new Date();
        return t;
    }
})();

然而还是没有解决调用时都必须进行一次判断的问题。

解决三:函数对象

函数也是一种对象,利用这个特性,我们也可以解决这个问题。

function foo() {
    if (foo.t) return foo.t;
    foo.t = new Date();
    return foo.t;
}

依旧没有解决调用时都必须进行一次判断的问题。

解决四:惰性函数

不错,惰性函数就是解决每次都要进行判断的这个问题,解决原理很简单,重写函数。

var foo = function() {
    var t = new Date();
    foo = function() {
        return t;
    };
    return foo();
};

更多应用

DOM 事件添加中,为了兼容现代浏览器和 IE 浏览器,我们需要对浏览器环境进行一次判断:

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

问题在于我们每当使用一次 addEvent 时都会进行一次判断。

利用惰性函数,我们可以这样做:

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);
        }
    }
})();

当我们每次都需要进行条件判断,其实只需要判断一次,接下来的使用方式都不会发生改变的时候,想想是否可以考虑使用惰性函数。

重要参考

Lazy Function Definition Pattern

作者:冴羽
github:https://github.com/mqyqingfeng/Blog
掘金主页:https://juejin.im/user/58e4b9b261ff4b006b3227f4
segmentfault主页:https://segmentfault.com/u/yayu/articles

Vicky丶Amor 经授权转载,版权归原作者所有。

相关文章

  • 前端_JavaScript

    JavaScript 专题之惰性函数 JavaScript 专题系列第十五篇,讲解惰性函数 需求 我们现在需要写一...

  • 『JavaScript专题』之惰性函数

    需求 我们现在需要写一个 foo 函数,这个函数返回首次调用时的 Date 对象,注意是首次。 解决一:普通方法 ...

  • JavaScript惰性函数

    惰性函数 定义: 惰性函数,函数内部有许多判断来来检测函数,这样多次调用会浪费时间和浏览器资源,所有当第一次判断完...

  • JavaScript惰性函数

    背景 在开发过程中,有时候需要对浏览器环境进行检测,比如封装一个AJAX函数的时候需要写一个函数进行检测,但是常规...

  • JavaScript:惰性函数

    前言 什么是惰性函数?惰性函数表示函数执行的分支只会在函数第一次调用的时候执行,在第一次调用过程中,该函数会被覆盖...

  • 『JavaScript专题』之函数记忆

    定义 函数记忆是指将上次的计算结果缓存起来,当下次调用时,如果遇到相同的参数,就直接返回缓存中的数据。 举个例子:...

  • JavaScript

    JavaScript高级函数 惰性函数 函数柯里化 级联函数(链式函数) 设计模式 单例模式 构造函数模式 工厂模...

  • JS专题系列之惰性函数与记忆函数

    一、惰性函数 惰性函数:顾名思义就是懒惰的函数,举一个简单的例子,如果我们需要判断当前浏览器是哪一种浏览器,我们需...

  • JS高级函数

    高级函数 在 JavaScript 中使用函数的高级方法。 数据类型的安全检测 构造函数的安全作用域 惰性载入函数...

  • 『JavaScript专题』之函数柯里化

    JavaScript专题之函数柯里化 定义 维基百科中对柯里化 (Currying) 的定义为: In mathe...

网友评论

    本文标题:『JavaScript专题』之惰性函数

    本文链接:https://www.haomeiwen.com/subject/pkqtpqtx.html