惰性载入(函数)-跟JS性能有关的思想
一、惰性载入概念:
惰性、懒惰、其实跟懒惰没有关系,就是图省事,把没意义的事少做、不做。
惰性载入函数:函数执行时会根据不同的判断分支最终选择合适的方案执行,但这样的分支判断仅会发生一次,后面的其他同类执行都不会在分支判断。提高了JS执行效率性能
一句话理解:某功能函数如果需要多个分支判断出一套方案,后续执行都仅需这一套方案就可采用“惰性载入”设计
二、用到的思想:
- 我们定义好的函数,实际上在执行的过程中是就可以被动态修改其定义的
- 除首次执行外,被修改的定义的函数后续被执行将用新的函数定义
三、一个DEMO:
原生JS给dom添加事件需要考虑宿主环境即浏览器环境的支持性,
比如IE系浏览器不同程度支持attachEvent或addEventListener,
其他大多数浏览器基本都支持addEventListener的方式
因此在用原生JS给dom添加事件的时候,我们封装了一个通用函数addEvent用以暴露统一的接口给dom添加事件,addEvent中会对是否存在attachEvent或addEventListener进行判断进而使用各自浏览器支持的事件方法给dom添加事件,然而传统的if else判断虽然能实现功能,但当前环境下后续的每次事件添加都会依次执行这些分支判断,显然是没有意义的执行,因为判断一次就够了,
具体实现:
定义方法addEvent,根据支持情况,在函数内部直接修改函数定义,最后返回执行新的该函数定义
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>惰性载入(函数)演示</title>
6 </head>
7 <body>
8
9 <button type="button" id="btn1">btn1</button>
10 <button type="button" id="btn2">btn2</button>
11 <button type="button" id="btn3">btn3</button>
12 <button type="button" id="btn4" onclick="console.log(addEvent)">查看 addEvent 函数</button>
13
14 <script>
15
16 function addEvent(el, eventName, fn) {
17 if (window.attachEvent) {
18 addEvent = function (el, eventName, fn) { // 修改函数addEvent的定义
19 el.attachEvent('on'+ eventName, fn);
20 }
21 } else if (window.addEventListener) {
22 addEvent = function (el, eventName, fn) { // 修改函数addEvent的定义
23 el.addEventListener(eventName ,fn);
24 }
25 }
26
27 return addEvent(el, eventName, fn) // 返回新的函数定义并执行
28 }
29
30 const btn1 = document.querySelector('#btn1'),
31 btn2 = document.querySelector('#btn2'),
32 btn3 = document.querySelector('#btn3');
33
34 addEvent(btn1, 'click', function () {
35 console.log('btn1 dosomething')
36 })
37
38 addEvent(btn2, 'click', function () {
39 console.log('btn2 dosomething')
40 })
41
42 addEvent(btn3, 'click', function () {
43 console.log('btn3 dosomething')
44 })
45
46 </script>
47 </body>
48 </html>
查看 addEvent 函数:
经过初始化后,addEvent函数编程了这样,已经没有了多余的判断,因为对于当前环境来说这就够了
1 ƒ (el, eventName, fn) {
2 el.addEventListener(eventName ,fn);
3 }
四、适应场景:
比如针对不同环境进行的相关处理,只需一次环境判断的情况
惰性载入(函数)-跟JS性能有关的思想的更多相关文章
- 利用函数的惰性载入提高 javascript 代码性能
在 javascript 代码中,因为各浏览器之间的行为的差异,我们经常会在函数中包含了大量的 if 语句,以检查浏览器特性,解决不同浏览器的兼容问题.例如,我们最常见的为 dom 节点添加事件的函数 ...
- 巧妙利用函数的惰性载入提高javascript 代码性能
在 javascript 代码中,因为各浏览器之间的行为的差异,我们经常会在函数中包含了大量的 if 语句,以检查浏览器特性,解决不同浏览器的兼容问题. 例如,我们最常见的为 dom 节点添加事件的函 ...
- JavaScript 函数惰性载入
最近看JavaScript高级程序设计,大有收获,接下来几天写一下读书笔记.之前写了一篇Ajax初步理解的随笔,里面有个函数用来创建XmlHttpRequest对象,浏览器兼容性原因,写出的代码通过大 ...
- web优化 js性能高级篇
今天我们继续上一个阶段关于web的性能优化,如何对js高级进行优化 (1)闭包 何为闭包; 一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 我认 ...
- javascript高级技巧篇(作用域安全、防篡改、惰性载入、节流、自定义事件,拖放)
安全的类型检测 在任何值上调用Object原生的toString()方法,都会返回一个[object NativeConstructorName]格式字符串.每个类在内部都有一个[[Class]]属性 ...
- js 性能优化整理之 惰性载入
跨检查浏览器特性,解决不同浏览器的兼容问题. 例如,我们最常见的为 dom 节点添加事件的函数 function addEvent(element,type,handler){ if(element. ...
- 客户端JS性能的一些优化的小技巧
下面是一些关于客户端JS性能的一些优化的小技巧:1.[顶]关于JS的循环,循环是一种常用的流程控制.JS提供了三种循环:for(;;). while().for(in).在这三种循环中 for(in) ...
- js 性能基准测试工具-告别可能、也许、大概这样更快更省
平时写js经常遇到这样做是不是更快点?但又没有具体简单可测试的工具,最近也倒序看博客园司徒正美 js分类下的文章 [ps:去年灵光一闪,发现看博客园排名前100的博客.按照文章分类倒序看是学习最快的方 ...
- 你不知道的Node.js性能优化,读了之后水平直线上升
本文由云+社区发表 "当我第一次知道要这篇文章的时候,其实我是拒绝的,因为我觉得,你不能叫我写马上就写,我要有干货才行,写一些老生常谈的然后加上好多特技,那个 Node.js 性能啊好像 D ...
- Node.js性能分析神器Easy-Monitor
摘要: 使用Easy-Monitor,可以准确定位Node.js应用的性能瓶颈,帮助我们优化代码性能. 当应用出现性能问题时,最大的问题在于:如何准确定位造成性能瓶颈的代码呢?对于Node.js开发者 ...
随机推荐
- Python中用requests处理cookies的3种方法
在接口测试中,大多数项目的接口是需要登录后进行操作的,经常用到requests库进行模拟登录及登录后的操作,下面是我不断踩坑后总结出来的关于登录凭证cookies的3种操作方法. 一. 用 reque ...
- flex布局,均分的剩余空间不等分问题
flex布局:使用flex-grow均分剩余空间,每个盒子都要给个初始宽度,才能均分
- 原生JS点击显示/隐藏
代码实现 HTML <div class="box box1"> <div class="btn"> <span onclick= ...
- Python Cli 编写指南
Python Cli 编写指南 python实现cli 环境: python 3.8 库 python自带argparse 指南 简单示例 : cli.py import argparse def c ...
- jmeter非GUI模式运行-分布式测试
上一篇文章我们说到了jmeter命令行运行但是是单节点下的, jmeter底层用java开发,耗内存.cpu,如果项目要求大并发去压测服务端的话,jmeter单节点难以完成大并发的请求,这时就需要对j ...
- 管理名称空间资源(Kubernetes)
管理名称空间资源 名称空间(Namespace)是Kubernetes集群级别的资源,用于将集群分隔为多个隔离的逻辑分区以配置给不同的用户.租户.环境或项目使用.例如,可以为development.q ...
- 模态框拖拽案例分析--元素偏移量 offset 系列
弹出框,我们也称为模态框. 模态框拖拽案例分析: (1)点击弹出层, 会弹出模态框, 并且显示灰色半透明的遮挡层. (2)点击关闭按钮,可以关闭模态框,并且同时关闭灰色半透明遮挡层. (3)鼠标放到模 ...
- esxi 6.7手动安装阵列卡驱动()2023-01.03
一.登录vmware后台在兼容性列表里面查找驱动,https://www.vmware.com/resources/compatibility/search.php 二. 下载对应的驱动https:/ ...
- Debug --> 使用USTC-TK2016工具对USTC-TFC2016数据集进行处理
文件介绍: https://blog.csdn.net/u010916338/article/details/86511009?spm=1001.2101.3001.6661.1&utm_me ...
- 【python】第二模块 步骤一 第一课、MySQL的介绍
第一课.MySQL的介绍 一.课程介绍 1.1 课程介绍 学习目标 了解关系型数据库的重要性 为什么会出现关系型数据库? 有哪些常见的关系型数据库? 掌握MySQL的安装和配置 怎么安装MySQL数据 ...