JavaScript学习笔记之惰性函数示例详解

发布时间 - 2026-01-11 02:58:42    点击率:

前言

本文主要给大家介绍了关于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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。


# javascript  # 惰性函数  # js  # 惰性求值  # JavaScript惰性求值的一种实现方法示例  # JS设计模式之惰性模式(二)  # JS 学习总结之正则表达式的懒惰性和贪婪性  # JS优化与惰性载入函数实例分析  # js正则表达式惰性匹配和贪婪匹配用法分析  # JavaScript AJAX之惰性载入函数  # 利用函数的惰性载入提高javascript代码执行效率  # JavaScript 函数惰性载入的实现及其优点介绍  # 如何用JavaScript实现一个数组惰性求值库  # 首次  # 全局变量  # 都必须  # 相关内容  # 都要  # 说了  # 一是  # 不多  # 这个问题  # 很容易  # 我们可以  # 这样做  # 给大家  # 很简单  # 重写  # 只需要  # 可以使用  # 我们现在  # 当我们  # 这篇文章 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: php json中文编码为null的解决办法  EditPlus中的正则表达式实战(5)  如何续费美橙建站之星域名及服务?  如何快速搭建自助建站会员专属系统?  海南网站制作公司有哪些,海口网是哪家的?  如何在Windows 2008云服务器安全搭建网站?  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  bootstrap日历插件datetimepicker使用方法  canvas 画布在主流浏览器中的尺寸限制详细介绍  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  简历没回改:利用AI润色让你的文字更专业  高端建站如何打造兼具美学与转化的品牌官网?  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  微信h5制作网站有哪些,免费微信H5页面制作工具?  高端网站建设与定制开发一站式解决方案 中企动力  网站制作企业,网站的banner和导航栏是指什么?  实现点击下箭头变上箭头来回切换的两种方法【推荐】  详解Android中Activity的四大启动模式实验简述  如何在云服务器上快速搭建个人网站?  如何快速生成高效建站系统源代码?  Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置  猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】  JavaScript如何实现继承_有哪些常用方法  如何基于云服务器快速搭建网站及云盘系统?  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程  在centOS 7安装mysql 5.7的详细教程  如何用腾讯建站主机快速创建免费网站?  Laravel如何实现事件和监听器?(Event & Listener实战)  太平洋网站制作公司,网络用语太平洋是什么意思?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  如何快速启动建站代理加盟业务?  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  香港服务器WordPress建站指南:SEO优化与高效部署策略  昵图网官网入口 昵图网素材平台官方入口  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程  如何用PHP快速搭建CMS系统?  Laravel如何处理和验证JSON类型的数据库字段  Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲  如何快速生成橙子建站落地页链接?  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】  Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势  laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法  Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出