还在每次都写判断?试试惰性函数,让你的代码更聪明!

什么是惰性函数?

先来看个例子

js 复制代码
function addEvent(el, type, handler) {
  if (window.addEventListener) {
    el.addEventListener(type, handler, false);
  } else {
    el.attachEvent('on' + type, handler);
  }
}

上面这段代码中,每次调用 addEvent 都会进行一遍判断。实际上,我们并不需要每次都进行判断,只需要执行一次就够了,当然,我们也可以存个全局的flag来记录,但是,有更好的办法了

js 复制代码
function addEvent(el, type, handler) {
  if (window.addEventListener) {
    addEvent = function(el, type, handler) {
      el.addEventListener(type, handler, false);
    }
  } else {
    addEvent = function(el, type, handler) {
      el.attachEvent('on' + type, handler);
    }
  }
  return addEvent(el, type, handler); // 调用新的函数
}

这就是惰性函数:第一次执行时会根据条件覆盖自身,后续调用直接执行更新后的逻辑

惰性函数的实现方式

惰性函数一般情况下有两种实现方式

在函数内部重写自身

这种实现方式就是上面我们介绍的那样

js 复制代码
function foo() {
  console.log('初始化...');
  foo = function() {
    console.log('后续逻辑');
  }
}

大多数情况下,这种实现方式都可以覆盖

用函数表达式赋值

js 复制代码
const foo = (function() {
  if (someCondition) {
    return function() { console.log('A'); }
  } else {
    return function() { console.log('B'); }
  }
})();

这种情况适用于模块或者立即执行的情况,其实就是用闭包做了个封装

惰性函数的应用场景

兼容性判断

我们在做适配的时候,很多时候需要进行浏览器特性的判断,比如之前提到的事件绑定

性能优化

其实惰性函数说起来很像单例,他的原理就是只执行一次,那么如果想要避免一些重复操作,尤其是重复初始化,就可以想一下是不是可以用惰性函数来处理,比如Canvas渲染引擎,加载某些外部依赖、判断登录状态等等

注意事项

  1. 写好注释,一定要写好注释,因为函数在执行后会变化,不写注释如果除了一些问题,可能后面维护的人会骂街,会大大增加你的不可替代性,咳咳,千万不要这么操作,一定要写好注释
  2. 不适合频繁修改逻辑和复杂上下文的场景,会增加复杂度

一句话总结:能判断一次就不要判断两次,惰性函数让你的代码更聪明

相关推荐
刘_小_二13 分钟前
Nginx设置开机自启动(Linux版本)
前端
小鱼计算机19 分钟前
【6】深入学习http模块(万字)-Nodejs开发入门
前端·javascript·http·node.js·http请求
再玩一会儿看代码22 分钟前
彻底掌握 XMLHttpRequest(XHR):前端通信的基石
前端·经验分享·笔记·学习·xhr
爱上大树的小猪23 分钟前
【前端样式】使用Flexbox实现经典导航栏:自适应间距与移动端折叠实战
前端·css·面试
前端开发呀26 分钟前
无所不能的uniapp拦截器
前端·uni-app
itsOli31 分钟前
(22)详情页开发——④ 详情页“列表”和“用户评论”组件 | Vue.js 项目实战: 移动端“旅游网站”开发
前端·javascript·vue.js
前端大卫42 分钟前
mac 常用技巧与问题汇总
前端·mac
鸿蒙场景化示例代码技术工程师43 分钟前
实现页面全屏功能鸿蒙示例代码
前端
funnycoding43 分钟前
mcp vs function call区别
前端·架构
鸿蒙场景化示例代码技术工程师1 小时前
实现PdfKit功能鸿蒙示例代码
前端