首页 > 其他分享 >手写节流、深拷贝函数实现

手写节流、深拷贝函数实现

时间:2023-10-14 18:01:12浏览次数:31  
标签:function const 节流 args timer 手写 lastTime 拷贝 fn

防抖函数基本实现

1 function debounce(fn,delay){
2     let timer=null
3     return function(...args){
4         if(timer)clearTimeout(timer)
5         timer=setTimeout(() => {
6             fn.apply(this,args)
7         }, delay);
8     }
9 }

防抖函数完正版

 1 function debounce(fn,delay,immediate=false){
 2     let timer=null
 3     let isInvoke=false
 4     const _debounce = function(...args){
 5         return new Promise((resolve,reject)=>{
 6             if(timer)clearTimeout(timer)
 7             //判断是否需要立即执行
 8             if(immediate&& !isInvoke){
 9                 const result=fn.apply(this,args)
10                 resolve(result)
11                 isInvoke=true
12             }else{
13                 timer=setTimeout(() => {
14                     const result=fn.apply(this,args)
15                     resolve(result)
16                     isInvoke=false
17                     timer=null
18                 }, delay);
19             }
20         })
21     }
22 
23     //封装取消功能
24     _debounce.cencel=function(){
25         if(timer)clearTimeout(timer)
26         timer=null
27         isInvoke=false
28     }
29     return _debounce
30 }

节流函数基本实现

 1 节流 基本实现
 2 function throttle(fn,interval){
 3     //1.记录上一次的开始时间
 4     let lastTime=0
 5     //2.事件触发时,真正执行的函数
 6     const _throttle=function(){
 7         //2.1.获取当前事件触发时的时间
 8         const nowTime=new Date().getTime()
 9         //2.2.使用当前触发的时间和之前的时间间隔以及上一次开始的时间,计算出还剩余多长事件需要去触发函数
10         const remainTime=interval-(nowTime-lastTime)
11         if(remainTime<=0){
12             //2.3.真正触发函数
13             fn()
14             //2.4.保留上次触发的时间
15             lastTime=nowTime
16         }
17     }
18     return _throttle
19 }

节流函数完整版本

 1 function throttle(fn,interval,options={leading:true,trailing:false}){
 2     const {leading,trailing,resultCallback}=options
 3     //1.记录上一次的开始时间
 4     let lastTime=0
 5     let timer=null
 6     //2.事件触发时,真正执行的函数
 7     const _throttle=function(...args){
 8         //2.1.获取当前事件触发时的时间
 9         const nowTime=new Date().getTime()
10         if(!lastTime&&!leading){
11             lastTime=nowTime
12         }
13         //2.2.使用当前触发的时间和之前的时间间隔以及上一次开始的时间,计算出还剩余多长事件需要去触发函数
14         const remainTime=interval-(nowTime-lastTime)
15         if(remainTime<=0){
16             if(timer){
17                 clearTimeout(timer)
18                 timer=null
19             }
20             //2.3.真正触发函数
21             const result=fn.apply(this,args)
22             if(resultCallback)resultCallback(result)
23             //2.4.保留上次触发的时间
24             lastTime=nowTime
25             return
26         }
27         if(trailing&&!timer){
28             timer=setTimeout(() => {
29                 timer=null
30                 lastTime=!leading?0:new Date().getTime()
31                 const result=fn.apply(this,args)
32                 if(resultCallback)resultCallback(result)
33             }, remainTime);
34         }
35     }
36     _throttle.cancel=function(){
37         if(timer)clearTimeout(timer)
38         timer=null
39         lastTime=0
40     }
41     return _throttle
42 }

 

标签:function,const,节流,args,timer,手写,lastTime,拷贝,fn
From: https://www.cnblogs.com/KooTeam/p/17764485.html

相关文章

  • BeanUtils.copyProperties这个方法是深拷贝浅拷贝,还是深复制浅复制?
    1、关于BeanUtils.copyProperties方法的拷贝类型,它是浅拷贝哦。这意味着在拷贝对象时,它只会复制对象的引用而不会复制对象的内容。所以,如果原始对象中的某个属性发生改变,拷贝后的对象中的相应属性也会随之改变。当然,如果你希望进行深拷贝或深复制,需要使用其他方法来实现哦`BeanUt......
  • Python - 深拷贝一个带有指向自身引用的列表,会报错么?紧接着用==比较,会报错么?
    问题描述深拷贝一个带有指向自身引用的列表:列表x中有指向自身的引用,因此x是一个无限嵌套的列表。importcopyx=[1]x.append(x)>>x[1,[...]]y=copy.deepcopy(x)>>y[1,[...]] 深拷贝不报错但是我们发现深度拷贝x到y后,程序并没有出现stackoverf......
  • 用 Java 徒手写一个抽奖系统,拿去用吧
    1、概述项目开发中经常会有抽奖这样的营销活动的需求,例如:积分大转盘、刮刮乐、老虎机等等多种形式,其实后台的实现方法是一样的,本文介绍一种常用的抽奖实现方法。整个抽奖过程包括以下几个方面:奖品奖品池抽奖算法奖品限制奖品发放2、奖品奖品包括奖品、奖品概率和限制、奖品记录。奖......
  • 浅谈深拷贝和浅拷贝
    深拷贝和浅拷贝深拷贝importcopylist1=[1,2,3,4,[5,6,7]]list2=copy.deepcopy(list1)print(list1)print(list2)[1,2,3,4,[5,6,7]][1,2,3,4,[5,6,7]]list1[0]+=1print(list1)print(list2)[2,2,3,4,[5,6,7]][1,2,3,4,[5,6,7]]list1[4]......
  • [完结16章]React18内核探秘:手写React高质量源码迈向高阶开发
    点击下载——[完结16章]React18内核探秘:手写React高质量源码迈向高阶开发  提取码:8epr手写React高质量源码,迈向高阶开发React18内核探秘:手写React高质量源码迈向高阶开发batching批处理,说的是,可以将回调函数中多个setState事件合并为一次渲染,因此是异步的。解决的问题是......
  • vue项目使用lodash节流防抖函数问题与解决
    背景在lodash函数工具库中,防抖_.debounce和节流_.throttle函数在一些频繁触发的事件中比较常用。防抖函数_.debounce(func,[wait=0],[options=])创建一个debounced(防抖动)函数,该函数会从上一次被调用后,延迟 wait 毫秒后调用 func 方法。参数func (Function):要防抖......
  • 关于C++拷贝控制
    通常来说,对于类内动态分配资源的类需要进行拷贝控制:要在拷贝构造函数、拷贝赋值运算符、析构函数中实现安全高效的操作来管理内存。但是资源管理并不是一个类需要定义自己的拷贝控制成员的唯一原因。C++Primer第5版中给出了一个Message类与Folder类的例子,分别表示电子邮件消息......
  • 手写PCA(主元分析法)计算点云法向量(详细注释) 【Matlab代码】
    原理PCA原理主元分析法PCA学习笔记点云法向量与点云平面拟合的关系(PCA)EstimatingSurfaceNormalsinaPointCloud3D【24】PCA点云法向量估计利用PCA计算点云的法线3D点云法向量估计(最小二乘拟合平面)为什么用PCA做点云法线估计?利用PCA求点云的法向量pca_demo.mclcclearclosea......
  • 前后端以数据url的方式传递字节流
    正常情况下通过字节流,将本地的一张图片渲染到前端(vue2):后端:StringimagePath="图片路径";byte[]imageBytes=Files.readAllBytes(Paths.get(imagePath));//获取文件字节Stringbase64Image=Base64.getEncoder().encodeToString(imageBytes);//把这些图片......
  • java本地文件多线程拷贝
    简单介绍:本地文件多线程拷贝是指通过多个线程同时进行文件复制操作。传统的文件复制操作往往是串行进行的,当需要复制单个大文件时,复制速度往往会比较慢。而采用多线程进行文件拷贝可以提高效率。通过同时创建多个线程,每个线程负责复制不同的文件或者不同的文件片段,可以充分利用计......