javascript的惰性函数是什么?

简介: 本文介绍了JavaScript中的惰性函数概念及其应用。由于浏览器兼容性问题,一个API在不同浏览器中的表现可能不同,通常需要通过if判断来处理。但每次都执行if判断效率低下,因此引入了惰性函数。惰性函数确保if分支只执行一次,后续直接调用支持的代码分支,提升性能。文中提供了两种实现方案:一是首次调用时重定义函数;二是声明时即指定适当函数。最后分析了惰性函数的优缺点,并总结其核心思想为“一次性搞定,避免重复工作”。

背景

大家应该都听说过JavaScript的立即执行函数,但是惰性函数是个什么东东?通过下面的             🌰大家就知道为什么会有惰性函数式?

我们知道javascript最大的问题就是浏览器的兼容问题,一个api在不同的浏览器调用的结果是不一样的,有的时候我们需要通过if判断来实现不同的兼容问题:

kotlin

代码解读

复制代码

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

上面是一个兼容不同浏览器事件绑定的方法,但是,他有一个问题:

每次调用这个方法都要进行if判断,如果浏览器支持其中的一个方法,那么它就永远支持了,没有必要每次调用都要执行一次if判断。

惰性函数

惰性函数的出现就是为了解决上面的bug,所谓的惰性函数就是if分支只会执行一次,之后调用函数时,直接进入所支持的分支代码。

方案一

第一种方案是函数在第一次调用时,对函数本身进行二次处理,该函数会被覆盖为符合分支条件的函数,这样对原函数的调用就不用再经过执行的分支了,我们可以用下面的方式使用惰性载入重写addEvent()。

kotlin

代码解读

复制代码

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;
        }
    }   
    return addEvent(type, element, fun);
}

在这个惰性载入的addEvent()中,if语句的每个分支都会为addEvent变量赋值,有效覆盖了原函数。最后一步便是调用了新赋函数。下一次调用addEvent()的时候,便会直接调用新赋值的函数,这样就不用再执行if语句了。

方案二

在声明函数时就指定适当的函数。这样在第一次调用函数时就不会损失性能了,只在代码加载时会损失一点性能。一下就是按照这一思路重写的addEvent()。

kotlin

代码解读

复制代码

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

这个例子中使用的技巧是创建一个匿名的自执行函数,通过不同的分支以确定应该使用哪个函数实现,实际的逻辑都一样,不一样的地方就是使用了函数表达式(使用了var定义函数)和新增了一个匿名函数,另外每个分支都返回一个正确的函数,并立即将其赋值给变量addEvent。

惰性载入函数的优点只执行一次if分支,避免了函数每次执行时候都要执行if分支和不必要的代码,因此提升了代码性能,至于那种方式更合适,就要看您的需求而定了。

优缺点

优点

惰性载入函数有两个主要优点,

1、是显而易见的效率问题,虽然在第一次执行的时候函数会意味赋值而执行的慢一些,但是后续的调用会因为避免的重复检测更快;

2、是要执行的适当代码只有当实际调用函数是才执行,很多JavaScript库在在加载的时候就根据浏览器不同而执行很多分支,把所有东西实现设置好,而惰性载入函数将计算延迟,不影响初始脚本的执行时间。

缺点

当重定义自身时已经添加到原始函数的任何属性丢会丢失。

如果该函数使用了不同的名称,比如分配给不同的变量或者以对象的方法来使用,那么重定义部分将永远不会发生,并且将会执行原始函数体。

总结

  • 惰性函数的实现原理就是重新定义函数:
  • 惰性思想的精髓:能一次搞定的事,我绝不做第二次:初始化程序并且只仅需执行一次的时候,这种方式非常有用,可以避免频繁的逻辑判断和避免重复的工作,提升应用程序的性能


转载来源:https://juejin.cn/post/6844903721600712718

相关文章
linux实用技巧:cp时自动将软链接所指定的文件实体也一起copy(软链接将会变成目标文件实体)
linux实用技巧:cp时自动将软链接所指定的文件实体也一起copy(软链接将会变成目标文件实体)
linux实用技巧:cp时自动将软链接所指定的文件实体也一起copy(软链接将会变成目标文件实体)
|
前端开发 JavaScript 测试技术
React 分页组件 Pagination
本文介绍了如何在 React 中从零构建分页组件,涵盖基础概念、常见问题及解决方案。通过示例代码详细讲解了分页按钮的创建、分页按钮过多、初始加载慢、状态管理混乱等常见问题的解决方法,以及如何避免边界条件、性能优化和用户反馈等方面的易错点。旨在帮助开发者更好地理解和掌握 React 分页组件的开发技巧,提升应用的性能和用户体验。
651 3
|
Java 关系型数据库 MySQL
Java项目实战(图书管理系统)
本项目为简易图书管理系统,实现图书增删改查、用户借阅归还及基础用户管理功能。采用Java语言,结合MySQL数据库与MVC架构,涵盖JDBC、Servlet、JSP等技术,适合初学者学习Java Web开发流程与项目结构设计。
687 2
|
SQL 消息中间件 JavaScript
如何开发人事及OA管理系统的招聘管理板块?(附架构图+流程图+代码参考)
本文介绍了如何构建一个高效、闭环的招聘管理系统,涵盖从需求发布、简历筛选、面试安排到Offer发放的全流程。文章提出了“标准化→自动化→数据化”的三步走策略,并提供了系统架构图、核心数据库设计、前后端开发示例及实用开发技巧,助力企业实现招聘流程的数字化升级。
|
IDE 编译器 项目管理
Dev-C++保姆级安装教程:Win10/Win11环境配置+避坑指南(附下载验证)
Dev-C++ 是一款专为 Windows 系统设计的轻量级 C/C++ 集成开发环境(IDE),内置 MinGW 编译器与调试器,支持代码高亮、项目管理等功能。4.9.9 版本作为经典稳定版,适合初学者和教学使用。本文详细介绍其安装流程、配置方法、功能验证及常见问题解决,同时提供进阶技巧和扩展学习资源,帮助用户快速上手并高效开发。
|
机器学习/深度学习 人工智能 安全
阿里云先知安全沙龙(武汉站) ——AI赋能软件漏洞检测,机遇, 挑战与展望
本文介绍了漏洞检测的发展历程、现状及未来展望。2023年全球披露的漏洞数量达26447个,同比增长5.2%,其中超过7000个具有利用代码,115个已被广泛利用,涉及多个知名软件和系统。文章探讨了从人工审计到AI技术的应用,强调了数据集质量对模型性能的重要性,并展示了不同检测模型的工作原理与实现方法。此外,还讨论了对抗攻击对模型的影响及提高模型可解释性的多种方法,展望了未来通过任务大模型实现自动化漏洞检测与修复的趋势。
|
并行计算 监控 异构计算
nvidia-smi命令输出的信息解读
【5月更文挑战第13天】nvidia-smi命令输出的信息解读
2446 5
|
Linux Windows
Postman 汉化 中文版
Postman中文版最新为9.12.2,2022-02-06更新。要安装汉化版,请遵循以下步骤:下载对应平台的Postman(官方或历史版本),然后根据Windows、Mac或Linux的指示安装中文包。在Windows中,找到安装路径解压缩并替换app.zip;Mac在应用程序目录替换app文件夹;Linux下载app.zip并解压到安装目录。记得禁用自动更新,可修改hosts文件或删除Windows的update.exe。不使用联网工作区可启用Scratch Pad模式。
2962 6
|
Web App开发 Linux 编译器
Linux基于webRTC的二次开发(一)
Linux基于webRTC的二次开发(一)
|
5G 调度
带你读《5G 系统技术原理与实现》——3.3 5G 时频资源
带你读《5G 系统技术原理与实现》——3.3 5G 时频资源
带你读《5G 系统技术原理与实现》——3.3 5G 时频资源