JavaScript专题之惰性函数
创始人
2025-05-31 09:26:53

参考原文:JavaScript专题之惰性函数

需求

我们现在需要写一个 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

相关内容

热门资讯

郎酒,在端午奏响一曲“心曲” 赤水河畔,端午风暖。 5月31日,郎酒庄园内,一年一度的端午制曲大典如期而至。今年端午的郎酒庄园,格...
蔚来公司5月交付新车23231... 新京报贝壳财经讯 6月1日,据蔚来官方微博消息,2025年5月,蔚来公司交付新车23231台,同比增...
智慧轨道交通运维监控解决方案         交通作为国民经济和社会发展的基础性、先行性产业,在整个社会经济、民生发...
GIT版本控制工具 Git版本控制工具 第一章 版本控制工具简介 1.版本控制工具的发展历史经过: 原始人工维护状态&#...
d的模板别名问题 原文 struct Matrix(S, size_t M, size_t N){}alias Vec...
Visual Studio更改... 目录:问题描述一、进入VS界面二、更改并下载.Net Framework目标框架三、N...
鲁政委:贸易环境缓和,产需指数... 鲁政委 郭于玮 张励涵(鲁政委系兴业银行首席经济学家、中国首席经济学家论坛理事)PMI5月制造业、服...
RK3588 Android1... 调试前先找模块厂获取相关资料Kernel修改:供电引脚,我是自己写的驱动...
SQL:exists/not ... exists/not existsselect * from table_name where [n...
mysql-windows安装... 下载 https://mirrors.tools.huawei.com/mysql/Download...
C++IO流(1) @TOC C++IO流 C++流 流就是若干字节组成字节序...
燕翔:5月份PMI数据点评:P... 燕翔 朱成成 许茹纯 杨文吉(燕翔 系方正证券首席经济学家、中国首席经济学家论坛理事)核心结论5月份...
高瑞东:“抢出口”带动制造业P... 高瑞东 刘星辰(高瑞东 系光大证券首席经济学家、中国首席经济学家论坛理事)核心观点事件:2025年5...
GuLi商城-SpringCl... 当微服务数量很庞大时,将所有配置都书写到一个配置文件中,显然不是太合适。...
1.freertos应用系列之... freertos应用全系列(写完关联更新) 01.freertos应用系...
CSS的浮动(上) 🌟所属专栏:前端只因变凤凰之路🐔作者简介:...
上市首秀后,霸王茶姬能睡个好觉... 5月30日晚,不久前赴美上市的霸王茶姬发布了上市以来首份季度财报,GMV、净收入和利润等关键经营数据...
AI工具(ChatGPT)常用... 要国内使用AI工具,关注:码视野,回复:10...
工业控制系统背景与概述 工业控制系统背景与概述工业控制系统的背景工业控制系统的重要性工业控制系统的应用工业控制系统的未来发展...
分布式Id的5种应用场景 UUID优点:(1)使用简单(2࿰...
1.5亿就能帮大厂改命了? 1... 出品|虎嗅黄青春频道作者|商业消费主笔黄青春题图|视觉中国5月27日港股盘后,快手向市场递上2025...
循环神经网络(二)(简单循环神... 文章目录简单循环神经网络模型定义模型特点理解简单循环神经网络NumPy 实现keras 实现Refe...
让项目干系人满意的3大要点         1、提升核心干系人的体验         关于项目干系人的分析识别以及相关权利利益矩...
八旬老人花105万买基金亏了3... 红星资本局6月1日消息,近日,裁判文书网披露的一份终审民事判决书显示,一位年过八旬的投资者在2021...
【算法系列之回溯算法】leet... 39. 组合总和 力扣题目链接 给你一个 无重复元素 的整数数组 candidates 和一个目标整...
js值的比较 值的比较 前言: 本篇文章主要介绍了 js 类型值的比较以及相等性检查,...
美国贸易代表办公室延长对中国3... 政策速递经济观察网讯 当地时间5月31日,美国贸易代表办公室宣布,延长对中国在技术转让、知识产权和...
机器学习的模型评估 模型评估 模型分为分类模型 和回归模型 模型简介 类别评估方法简介分类模型准确率(Ac...
赤诚生物终止北交所IPO 原拟... 中国经济网北京6月1日讯 北交所网站2025年5月30日披露关于终止对五峰赤诚生物科技股份有限公司(...
赛事运动激活文旅经济,产业升级... 中国商报(记者 王怡菲)5月15日,国务院召开的做强国内大循环工作推进会强调,要“以国内大循环的内在...