js惰性函数

news2024/11/24 1:27:10

看下面这份ts代码

在这里插入图片描述

实现的效果也很简单,就是将一份文本,复制到剪切板上,未了兼容更多的浏览器(没错说的就是你=>ie !),做了一个兼容性判断,
当浏览器支持navigator.clipboard这个api时,就直接调用这个api将文本复制到剪切板中,
如果不支持这个api的话,就执行else里面的代码,这段代码会创建一个input输入框,然后将需要复制到剪切板的文本放到这个input框里面,然后将input放入body标签,再然后选中这个输入框,再执行复制命令,最后销毁这个input框,

这样写这份代码,功能性上肯定是没什么问题,但是这份代码是有缺陷的,比如当我第一吃执行完这个代码的时候,我们就已经知道了,我们用的是什么浏览器了,浏览器支不支持这个api,在第一次调用的时候就已经可以确定了,但是我们这份代码却需要`在每一次调用的时候,都重新去判段浏览器支不支持这个api,这显然是浪费性能的,所以我们就需要对这份代码进行改造,希望第一次运行时,确定了是要执行那一份代码的时候,后面再执行,就不再做判断了

这时候就需要将它改成惰性函数了,如下
…它还不允许,稍等,我改下

在这里插入图片描述

如下,copyText 函数第一次运行时,函数判断浏览器支不支持navigator.clipboard这个api,如果浏览器支持这个api就会将这个函数改成第一种格式,如果不支持,就改成第二种模式,这样的话,下次再执行copText函数的话,就不会在次去判断浏览器支不支持这个api了

在这里插入图片描述

当然,就这样改还不行,因为现在第一次调用这个函数的时候,只是将函数更改了,所以还需要再调用一次这个改过的函数

在这里插入图片描述

tips: 一不小心加上了注释
这样改完之后,就算是解决了那个问题,就剩检验了,将上面的ts代码转换成js代码然后运行
得到如下js代码

var copyText = function (text) {
  if (navigator.clipboard) {
    copyText = function (text) { navigator.clipboard.writeText; };
    copyText(text);
  }
  else {
    copyText = function (text) {
      var input = document.createElement('input');
      input.setAttribute('value', text);
      document.body.appendChild(input);
      input.select();
      document.execCommand('copy');
      document.body.removeChild(input);
    };
    copyText(text);
  }
};

丢浏览器内运行

在这里插入图片描述

可以看到copy还未运行时是这样的,我们运行一次copyText然后再查看

在这里插入图片描述

如上图,可以看到,当我们执行了一次copyText函数后,函数就变成了

copyText = function (text) { navigator.clipboard.writeText; };

也就是说下次再次执行copyText函数时,将不会再做浏览器判断

总结

这种技术被称为“惰性函数”或“延迟执行”。它的核心思想是在函数首次调用时,根据不同的输入参数,函数的行为会被修改并确定下来,以避免在后续调用中再次执行完整的计算流程。这样可以提高程序的执行效率,并使代码更加简洁。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1034832.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Kafaka实现高吞吐量、低延迟的底层原理】

文章目录 Kafaka实现高吞吐量、低延迟的底层原理顺序写入Page Cache零拷贝分区分段索引批量读写批量压缩 Kafaka实现高吞吐量、低延迟的底层原理 Kafka虽然是基于磁盘做的数据存储,但却具有高并发、高吞吐量、低延时的特点,其吞吐量动辄几万、几十上百万…

springBoot对接多个mq并且实现延迟队列---未完待续

mq调用流程 创建消息转换器 package com.wd.config;import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; import org.springframework.amqp.support.converter.MessageConverter; import org.springframework.context.annotation.Bean; import o…

深度解析React 18应用性能提升

众所周知,React 18 引入的一个重要特性就是并发功能,从根本上改变了 React 应用程序的渲染方式。本文将带大家一同探讨这些最新功能的具体作用,特别是如何提高应用程序性能。 一、主线程与长任务 当我们在浏览器中运行 JavaScript 时,JS 引擎会在单线程环境下执行代码内容…

Kubernetes基础(二)-Headless Service

1 简介 Headless Service是一种特殊的服务类型,它不会分配虚拟 IP,而是直接暴露所有 Pod 的 IP 和 DNS 记录。这客户端可以直接访问 Pod IP 地址,并使用这些 IP 地址进行负载均衡。 Headless Services是一种特殊的service,其spec…

封装了一个中间放大效果的iOS轮播视图

效果图 计算逻辑 设定在中间展示的size,即正常size,然后设置水平和竖直方向上的margin, 在view的origin和scrollView的contentoffset相等的时候,即 视图处在正中间的时候,最大,然后通过计算其他视图的origin和scrollV…

计算机基础 堆和栈

首先我们需要知道的是栈和堆是两种数据结构 1.栈和堆的定义 栈:是一种先进后出的数据结构,是一种线性结构 堆是一种树形结构,是一颗完全二叉树, 其存储的元素可以通过指针或引用访问 最大堆【大根堆】 :堆中的每一个…

js-cookie使用 js深度克隆(判断引用类型是数组还是对象的方法)

cookie和深度拷贝的使用 1、js-cookie使用2、js深度克隆 1、js-cookie使用 前端的本地存储分为 localstorage、sesstionstorage、cookie 但是咱们有时候需要做7天免登录的需求时,选择 cookie 作为前端的本地存储是在合适不过的了 直接操作 cookie 可以, …

ModbusTCP 转 Profinet 主站网关在博图配置案例

兴达易控ModbusTCP转Profinet网关,在 Profinet 侧做为 Profinet 主站控制器,接 Profinet 设备,如伺服驱动器;兴达易控ModbusTCP 和 Profinet网关在 ModbusTCP 侧做为 ModbusTCP 从站,接 PLC、上位机、wincc 屏等。 拓扑…

Spring事务1+入门案例(简约银行转账)

0、事务基础概念 1.事务角色: 2.事务相关配置 一、配置文件的书写 1.JDBC配置文件 public class JdbcConfig {Value("${jdbc.driver}")private String driver;Value("${jdbc.url}")private String url;Value("${jdbc.username}")p…

win11安装h3c lab无法启动putty终端的解决方法

文章目录 问题记录作者自己的解决方法第一步:安装MobaXterm第二步:修改h3c lab的终端工具 问题记录 win11可以同时安装vm、virtualBox、typer-v安装,因为在最新的系统中已经兼容但是可能出现win11安装h3c lab无法启动putty终端的问题&#x…

数据结构_顺序表_尾插、尾删、头插、头删(附带详解)

文章目录 前言一. 线性表二. 顺序表 - - - 数组2.1 什么是顺序表2.2 顺序表一般可以分为2.2.1 静态顺序表(使用定长数组存储元素)2.2.2 动态顺序表:使用动态开辟的数组存储2.2.3 顺序表的接口实现 三. SeqList.c 中各个接口的实现。3.1 初始化…

Java实现Modbus Tcp协议读写模拟工具数据

标题 前言一、读写模拟工具中数据(1) 定义Controller层(2) 定义Service层实现 二、调试(1) 读数据(2) 向寄存器写单个数据(3) 向寄存器写多个数据 前言 参考文章:https://www.cnblogs.com/ioufev/p/10831289.html 该文中谈及常见的几种读取设备数据实现&#xff0…

无硬盘的版本 1099,14寸笔记本,而且无硬盘的,特别有有意思,可以自己购买个硬盘,安装linux系统或者windows。

1,千元笔记本,金属外壳 有人进行评测了: https://www.bilibili.com/video/BV1Td4y1K7Cp 1499元的全新笔记本,有什么猫腻? 看了下价格,现在还优惠400,变成了1099。 https://item.jd.com/100851…

Django — 请求和响应

目录 一、请求1、概念2、请求参数方式分类3、案例3.1、URL 路径参数3.2、查询字符串参数3.3、form 表单传参3.4、Json 格式参数3.5、上传文件 二、响应1、HttpResponse2、JsonResponse 三、GET 和 POST 区别1、相同点2、不同点 一、请求 1、概念 请求(Request&…

DDR4 眼图测试方法

DDR的全拼是Double Data Rate SDRAM双倍数据速率同步动态随机存取内存。主要就是用在电脑的内存。他的特点就是走线数量多,速度快,操作复杂,给测试和分析带来了很大的挑战。目前DDR技术已经发展到了DDR5,性能更高,功耗…

【算法练习Day4】 两两交换链表节点删除链表倒数第 N 个结点环形链表 II

​ ​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯长路漫漫浩浩,万事皆有期待 文章目录 两两交换链表中的节点一…

毫米波雷达 TI IWR1443 在 ROS 中进行 octomap 建图

个人实验记录 /mmwave_ti_ros/ros_driver/src/ti_mmwave_rospkg/launch/1443_multi_3d_0.launch <launch><!-- Input arguments --><arg name"device" value"1443" doc"TI mmWave sensor device type [1443, 1642]"/><arg…

一例“msvc编译器O2优化导致的崩溃”的分析

1. 初步分析 某进程崩溃必现。 打开崩溃dmp&#xff0c;结合c源代码&#xff0c;崩溃大致发生在某dll代码里的这句&#xff1a;SAFE_DELETE(pContentData); En_HP_HandleResult CTcpOperation::OnClintReceive(HP_Client pSender, HP_CONNID dwConnID, const BYTE * pdata, i…

组队竞赛(int溢出问题)

目录 一、题目 二、代码 &#xff08;一&#xff09;没有注意int溢出 &#xff08;二&#xff09;正确代码 1. long long sum0 2. #define int long long 3. 使用现成的sort函数 一、题目 二、代码 &#xff08;一&#xff09;没有注意int溢出 #include <iostream&g…

机器学习的主要内容

分类任务 回归任务 有一些算法只能解决回归问题有一些算法只能解决分类问题有一些算法的思路既能解决回归问题&#xff0c;又能解决分类问题 一些情况下&#xff0c; 回归任务可以转化为分类任务&#xff0c; 比如我们预测学生的成绩&#xff0c;然后根据学生的成绩划分为A类、…