秒懂高阶编程之惰性函数

简介: 秒懂高阶编程之惰性函数

前言

高阶编程听起来很高大上,但只要你弄懂了,一切就豁然开朗。
我将会用接下来的几篇文章讲一下高阶编程的一些技巧。
今天要讲解的是高阶编程技巧的惰性函数,又称(惰性载入函数)。

首先什么是惰性(载入)函数?

惰性载入表示函数执行的分支只会在函数第一次调用的时候执行,在第一次调用过程中,该函数会被覆盖为另一个按照合适方式执行的函数,这样任何对原函数的调用就不用再经过执行的分支了。

如果上面简述的定义让你难理解的话,我们看一个例子来理解一下。开发中我们总是会手写一个函数用于判断当前环境是哪种环境然后再执行相应环境下应该执行的代码(逻辑)。

下面是一个区分浏览器的兼容性来注册事件的一个函数,由于各浏览之间的差异,不得不用方法检测当前环境的能力,用以实现每种注册事件的方式。

function addEvent(type, element, fun) {
      if (element.addEventListener) {
        element.addEventListener(type, fun, false);
      }
      else if (element.attachEvent) {
        element.attachEvent('on' + type, fun);
      }
      else {
        element['on' + type] = fun;
      }
    }

从整体上看,上面的方法已经实现了区分了每种环境,但是实际上在同一环境中,分支其实走一次,做一回判断就可以了,不需要每次都要做一回判断。这样就引入了我们的惰性载入函数。惰性载入表示函数执行的分支仅会发生一次。实现惰性载入的方式有两种。第一种是在函数被调用的时候再处理函数。在第一次调用的过程中,该函数会被赋给为另一个按照合适方式执行的函数。这样任何对原函数的调用都不用在经过执行的分支了。方式一实现

function addEvent(type, element, fun) {
      if (element.addEventListener) {
        addEvent = function (type, element, fun) {
          element.addEventListener(type, fun, false);
        }
      }
      else if (element.attachEvent) {
        addEvent = function (type, element, fun) {
          element.attachEvent('on' + type, fun);
        }
      }
      else {
        addEvent = function (type, element, fun) {
          element['on' + type] = fun;
        }
      }
      addEvent(type, element, fun);
    }

第二种实现惰性载入的范式是在声明时就指定适当的函数,这样第一次调用是就不会损失性能了,而在代码首次加载时会损失一点性能。
方式二实现

function addEvent(type, element, fun) {
      if (element.addEventListener) {
        return function (type, element, fun) {
          element.addEventListener(type, fun, false);
        }
      }
      else if (element.attachEvent) {
        return function (type, element, fun) {
          element.attachEvent('on' + type, fun);
        }
      }
      else {
        return function (type, element, fun) {
          element['on' + type] = fun;
        }
      }
    }

参考

《JavaScript高级程序设计(第3版)》——第22章高阶技巧中惰性载入函数。

通过以上的方式希望你能对惰性(载入)函数有一定的理解。


听说分享关注的人都年薪百万了image.png

这里是前端扫地僧,和你一起分享前端的那些事。

相关文章
|
10月前
|
数据可视化 BI
利用可视化方法优化年终述职:职场人如何让汇报效率提升200%?
本教程教你用可视化思维打造高效述职报告:通过四大模块(成果全景、KPI仪表盘、能力雷达、未来规划)和五步法(数据整理、工具选择、设计原则、结构优化、演讲技巧),结合看板工具实操,将零散工作转化为直观图表,让成果清晰可见、价值精准传达,提升专业形象与汇报说服力。
1048 0
|
关系型数据库 MySQL
MySQL主从异常Coordinator stopped because there were error(s) in the worker(s). The most recent failur
MySQL主从异常Coordinator stopped because there were error(s) in the worker(s). The most recent failur
5853 0
|
人工智能 安全 网络安全
Burp Suite Professional 2025.5 for macOS x64 & ARM64 - 领先的 Web 渗透测试软件
Burp Suite Professional 2025.5 for macOS x64 & ARM64 - 领先的 Web 渗透测试软件
760 3
|
人工智能 安全 前端开发
github和npm开启2FA双重身份验证无法登陆
随着安全需求提升,许多应用如GitHub和npm已强制启用2FA(双重身份验证)。2FA通过用户名、密码及动态验证码增强账号安全性。若手机丢失或TOTP应用失效,可使用开启2FA时生成的recovery code登录并重新绑定。推荐使用大厂的TOTP工具,如Microsoft Authenticator、Google Authenticator等,避免小应用停服风险。若无备份码,只能通过人工申诉找回账号。
4408 15
github和npm开启2FA双重身份验证无法登陆
|
机器学习/深度学习 人工智能 物联网
大模型时代,还缺一只雨燕 | SWIFT:魔搭社区轻量级微调推理框架
伴随着大数据的发展和强大的分布式并行计算能力,以预训练+微调的模型开发范式渐渐成为深度学习领域的主流。 2023年各家推出的大模型浩如烟海,如GPT4、Llama、ChatGLM、Baichuan、RWKV、Stable-Diffusion等。这些模型在达到越来越好的效果的同时也需要越来越多的算力资源:全量finetune它们动辄需要几十至上百G显存训练部署,一般的实验室和个人开发者无力承担。
|
安全 Oracle Java
(四)深入理解Java并发编程之无锁CAS机制、魔法类Unsafe、原子包Atomic
其实在我们上一篇文章阐述Java并发编程中synchronized关键字原理的时候我们曾多次谈到过CAS这个概念,那么它究竟是什么?
671 1
|
监控 安全 应用服务中间件
wordpress被恶意搜索攻击(网址/?s=****)解决方法。
综上所述,保护WordPress网站不受恶意搜索攻击涉及到多种技术和策略。从使用插件到配置服务器和CDN服务,每种方法都为网站的安全提供了一个防御层。务必定期更新维护你的网站,保持安全插件和WordPress核心的最新状态,以预防可能出现的新攻击方式。安全是一个持续的过程,对网站进行定期的安全审查和优化是至关重要的。
680 0
|
人工智能 自然语言处理 搜索推荐
Open Notebook:开源 AI 笔记工具,支持多种文件格式,自动转播客和生成总结,集成搜索引擎等功能
Open Notebook 是一款开源的 AI 笔记工具,支持多格式笔记管理,并能自动将笔记转换为博客或播客,适用于学术研究、教育、企业知识管理等多个场景。
2605 0
Open Notebook:开源 AI 笔记工具,支持多种文件格式,自动转播客和生成总结,集成搜索引擎等功能