防抖和节流, 不改变this的指向会有啥问题,使用setTimeout模拟setinterval这样的好处有啥
防抖Debounce使用点击事件试下反例1return使用剪头函数 console.log(this)中的this会一直是window绑定不上它的调用者dom!DOCTYPE html html langzh-CN body input idsearchInput placeholder输入测试 script function debounce(fn, delay 300) { let timer null; // 返回箭头函数 return (...args) { // return function (...args) { clearTimeout(timer); timer setTimeout(() { console.log(this); fn.apply(this, args); }, delay); } } function handle() { console.log(当前this:, this); } const dbHandle debounce(handle); const input document.querySelector(#searchInput); // 直接把防抖函数交给事件监听 input.addEventListener(input, dbHandle); /script /body /html反例2!DOCTYPE html html langzh-CN body input idsearchInput placeholder输入测试 script function debounce(fn, delay 300) { let timer null; // 返回箭头函数 return function (...args) { clearTimeout(timer); timer setTimeout(() { console.log(this); fn.apply(this, args); }, delay); } } const handle () { console.log(当前this:, this); } // function handle() { // console.log(当前this:, this); // } const dbHandle debounce(handle); const input document.querySelector(#searchInput); // 直接把防抖函数交给事件监听 input.addEventListener(input, dbHandle); /script /body /html用setTimeout模拟setInterval的实现function myInterval(fn, delay) { // 定义递归函数负责执行回调并重新设置定时器 function loop() { fn(); // 执行目标函数 // 再次调用 setTimeout形成循环用闭包保存 timer方便清除 timer setTimeout(loop, delay); } // 启动第一次执行 let timer setTimeout(loop, delay); // 返回清除定时器的方法 return () clearTimeout(timer); }使用示例// 定义要循环执行的函数 function logTime() { console.log(当前时间:, new Date().toLocaleTimeString()); } // 模拟每 1000ms 执行一次类似 setInterval const cancel myInterval(logTime, 1000); // 5秒后停止循环 setTimeout(() { cancel(); console.log(已停止); }, 5000);二、这种方式的好处避免回调函数执行时间导致的间隔偏差原生setInterval会按照固定间隔计划下一次执行但若前一次回调执行时间超过了间隔比如回调耗时 200ms间隔 100ms会导致多次回调堆积、间隔混乱。而setTimeout模拟的方式是在前一次回调执行完毕后才开始计算下一次的间隔确保实际间隔不小于设定值更符合 “执行完再等一段时间” 的预期。更灵活的控制可以在每次循环中动态修改下一次的延迟时间比如根据业务场景调整间隔而setInterval的间隔是固定的。function myInterval(fn, delay) { function loop() { fn(); // 动态调整下一次延迟比如每次增加 100ms delay 100; timer setTimeout(loop, delay); } let timer setTimeout(loop, delay); return () clearTimeout(timer); }避免不可控的回调堆积若页面处于后台等情况setInterval可能会在页面恢复后一次性执行堆积的回调而setTimeout模拟的方式每次只计划下一次执行不会堆积。总结setTimeout模拟setInterval虽然代码稍复杂但在间隔准确性、灵活性和避免回调堆积上更有优势适合对执行时机要求较高的场景。

相关新闻

终极免费漫画阅读器Mihon:从零开始的完整配置指南

终极免费漫画阅读器Mihon:从零开始的完整配置指南

终极免费漫画阅读器Mihon:从零开始的完整配置指南 【免费下载链接】mihon Free and open source manga reader for Android 项目地址: https://gitcode.com/gh_mirrors/mi/mihon 你是否厌倦了各种广告满天飞的漫画阅读应用?想要一个完全免费、开源…

2026/8/7 17:23:29 阅读更多 →
React中Suspense和lazy怎么用实现懒加载

React中Suspense和lazy怎么用实现懒加载

React 中 Suspense 和 lazy 怎么用实现懒加载? 一句话总结:React.lazy 动态 import 组件实现代码分割,Suspense 包裹懒加载组件提供 loading fallback——两者配合让首屏只加载必要代码,按需加载路由级和组件级模块,bu…

2026/8/7 17:23:29 阅读更多 →
终极B站视频下载指南:使用bilidown轻松收藏哔哩哔哩内容

终极B站视频下载指南:使用bilidown轻松收藏哔哩哔哩内容

终极B站视频下载指南:使用bilidown轻松收藏哔哩哔哩内容 【免费下载链接】bilidown 哔哩哔哩视频解析下载工具,支持 8K 视频、Hi-Res 音频、杜比视界下载、批量解析,可扫码登录,常驻托盘。 项目地址: https://gitcode.com/gh_mi…

2026/8/7 17:23:29 阅读更多 →

最新新闻

C语言中字符数组的初始化与赋值

C语言中字符数组的初始化与赋值

1.字符数组初始化 在C语言中,字符串是当做字符数组来处理的;所以字符串有两种声明方式,一种是字符数组,一种是字符指针。 char parr[] "zifuchuanshuzu"; char charr[] { z,i,f,u,c,h,u,a,n,s,h,u,z,u }; 这是字符数…

2026/8/7 18:13:49 阅读更多 →
5分钟掌握ttkbootstrap主题系统:打造现代化Tkinter界面的终极指南

5分钟掌握ttkbootstrap主题系统:打造现代化Tkinter界面的终极指南

5分钟掌握ttkbootstrap主题系统:打造现代化Tkinter界面的终极指南 【免费下载链接】ttkbootstrap Modern themes for Tkinter. Sleek, responsive styles inspired by Bootstrap. Includes ready-to-use widgets, 30 themes, and tools for building beautiful, cro…

2026/8/7 18:13:49 阅读更多 →
Outfit字体:为现代数字设计量身打造的专业级开源字体解决方案

Outfit字体:为现代数字设计量身打造的专业级开源字体解决方案

Outfit字体:为现代数字设计量身打造的专业级开源字体解决方案 【免费下载链接】Outfit-Fonts The most on-brand typeface 项目地址: https://gitcode.com/gh_mirrors/ou/Outfit-Fonts 在当今数字设计领域,字体选择往往成为项目成败的关键因素。设…

2026/8/7 18:13:49 阅读更多 →
无需Root的Android虚拟定位神器:GoGoGo摇杆控制全解析

无需Root的Android虚拟定位神器:GoGoGo摇杆控制全解析

无需Root的Android虚拟定位神器:GoGoGo摇杆控制全解析 【免费下载链接】GoGoGo 一个基于 Android 调试 API 百度地图实现的虚拟定位工具,并且同时实现了一个可以自由移动的摇杆 项目地址: https://gitcode.com/GitHub_Trending/go/GoGoGo 想要在…

2026/8/7 18:13:49 阅读更多 →
深度解析LLM DataDist:大模型推理优化的3个关键架构突破

深度解析LLM DataDist:大模型推理优化的3个关键架构突破

深度解析LLM DataDist:大模型推理优化的3个关键架构突破 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率&#xff0c…

2026/8/7 18:13:49 阅读更多 →
Unity URP渲染管线入门:从核心原理到项目实战配置指南

Unity URP渲染管线入门:从核心原理到项目实战配置指南

1. 项目概述:为什么URP是Unity开发者的新起点如果你最近打开Unity Hub准备新建一个项目,可能会发现一个明显的变化:在渲染管线的选择上,除了经典的“内置渲染管线”,一个名为“通用渲染管线”的选项被放在了更显眼的位…

2026/8/7 18:12:49 阅读更多 →

日新闻

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南 【免费下载链接】scrcpy Display and control your Android device 项目地址: https://gitcode.com/GitHub_Trending/sc/scrcpy 想要将Android手机屏幕完美投射到电脑上,享受大屏操作的自…

2026/8/7 0:00:19 阅读更多 →
如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南 【免费下载链接】tom-select Tom Select is a lightweight (~16kb gzipped) hybrid of a textbox and select box. Forked from selectize.js to provide a framework agnostic autocomplete widget wi…

2026/8/7 0:00:19 阅读更多 →
5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件 【免费下载链接】nsz NSZ - Homebrew compatible NSP/XCI compressor/decompressor 项目地址: https://gitcode.com/gh_mirrors/ns/nsz 你是否在为Nintendo Switch游戏文件占用大量存储…

2026/8/7 0:00:19 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/6 22:02:27 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/6 22:02:27 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/7 17:02:37 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/6 22:02:28 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/7 17:02:36 阅读更多 →