前端经典面试题 | 理解 节流 和 防抖(后附手写节流\防抖)
admin
2024-01-20 20:49:31
0

🖥️ 前端经典面试题专栏:前端经典面试题 | 理解节流和防抖
🧑‍💼 个人简介:一个不甘平庸的平凡人🍬

✨ 个人主页:CoderHing的个人主页

🍀 格言: ☀️ 路漫漫其修远兮,吾将上下而求索☀️

👉 你的一键三连是我更新的最大动力❤️


目录

一、回答点

二、深入回答

节流和防抖的理解

防抖应用场景:

节流应用场景:

实现节流和防抖

简易版手撸节流函数

简易版手撸防抖函数

困难版手撸节流函数

困难版手撸防抖函数


一、回答点

防抖:事件被触发n秒后执行回调

节流:在规定一个时间段内,只能触发一次事件的回调函数

二、深入回答

节流和防抖的理解

  • 防抖:在事件被触发n秒后执行回调,如果在n秒内事件再次被触发,会重新计算时间;可使用在点击事件上,避免用户多次点击向后端发送多次网络请求.
  • 节流:在规定一个时间段内,只能触发一次事件的回调函数,如果在这个时间段内事件被多次触发,只会生效一次;可以用在页面滚动等事件监听上,通过节流来降低事件调用的频率.

防抖应用场景:

  • 按钮:防止多次点击按钮,只执行一次.
  • 服务端:表单验证需服务端进行配合,只执行一段输入的事件的最后一次;搜索框的联想词.

节流应用场景:

  • 拖拽:固定时间内只执行一次,防止高频率触发.
  • 缩放:监控resize.
  • 动画:固定时间内多次触发动画.

实现节流和防抖

简易版手撸节流函数

function throttle(fn, delay) {let curTime = Date.now();return function() {let ctx = this,args = arguments,nowTime = Date.now();// 如果两次时间间隔超过了指定时间,则执行函数。if (nowTime - curTime >= delay) {curTime = Date.now();return fn.apply(ctx, args);}};
}

简易版手撸防抖函数

function debounce(fn, wait) {let timer = null;return function() {let ctx = this,args = arguments;// 如果此时有定时器的话,取消之前的定时器重新记时if (timer) {clearTimeout(timer);timer = null;}// 设置定时器,让事件间隔指定时间后执行timer = setTimeout(() => {fn.apply(ctx, args);}, wait);};
}

困难版手撸节流函数

function throttle(fn, interval, options = { leading: true, trailing:false }) {// 记录开始时间const { leading,trailing,resultCallBack } = optionslet endTime = 0let timer = null// 触发,执行函数const _throttle = function(...args) {return new Promise((resolve, reject) => {// 获取当前时间触发的时间const newTime = new Date().getTime()if (!endTime && !leading) endTime = newTime// 使用触发的事件和之前的时间间隔及开始时间,计算出 还剩多长时间需要去触发函数const remainTime = interval - (newTime - endTime)if (remainTime <= 0){if (timer) {clearTimeout(timer)timer = null}// 触发函数const result = fn.apply(this, args)if (resultCallBack) resultCallBack (result)resolve(result)// 保留上次触发时间endTime = newTimereturn}if (trailing && !timer) {timer = setTimeout(() => {timer = nullendTime = !leading ? 0 : new Date().getTime()const result = fn.apply(this, args)if (resultCallBack) resultCallBack(result)resolve(resolve)},remainTime)}})}_throttle.cancel = function() {if(timer) clearTimeout(timer)timer = nullendTime = 0}return _throttle
}

困难版手撸防抖函数

function debounce(fn, delay, immediate = false, resultCallback) {// 1.定义一个定时器, 保存上一次的定时器let timer = nulllet invoke = false// 2.真正执行的函数const _debounce = function(...args) {return new Promise((resolve, reject) => {// 取消上一次的定时器if (timer) clearTimeout(timer)// 判断是否需要立即执行if (immediate && !invoke) {const res = fn.apply(this, args)if (resultCallback) resultCallback(res)resolve(res)invoke = true} else {// 延迟执行timer = setTimeout(() => {// 外部传入的真正要执行的函数const res = fn.apply(this, args)if (resultCallback) resultCallback(res)resolve(res)invoke = falsetimer = null}, delay)}})}// 取消功能_debounce.cancel = function() {console.log(timer)if (timer) clearTimeout(timer)timer = nullinvoke = false}return _debounce
}

相关内容

热门资讯

宽基ETF规模大增的三大理由 2026年,A股市场开局向好。Wind资讯数据显示,截至1月14日,开年以来ETF总规模增长超220...
冬季护眼 “睛”彩相伴|武汉普... 冬季天气寒冷干燥,室内取暖设备的使用让空气湿度降低,加上户外活动减少、长时间近距离用眼成为常态,干眼...
白银首破92美元,金铜锡拉升创... 2026年开年以来,全球金属市场迎来新一轮狂欢。 1月14日亚太交易时段,现货白银(伦敦银现)史上首...
阿尔茨海默病新疗法:针对Apo... 你是否曾想过,为什么身边的某些人总能保持思维敏捷,而有些人却逐渐被记忆模糊所困扰?这背后,阿尔茨海默...
中国工商银行申请银行业务流程管... 国家知识产权局信息显示,中国工商银行股份有限公司申请一项名为“银行业务流程管理方法、装置及电子设备”...
1月15日国际晨讯丨现货白银涨... 1月15日,日韩股市开盘齐跌;现货白银1月14日一度涨超7%,突破93美元关口;美联储最新发布的经济...
人民币升级,我们做好最坏的打算 朋友们,你可要留意啊! 在2026年刚开始的时候,一场静悄悄的、却完全能够对未来十年间财富格局造成影...
上涨近10倍!西红柿最近为啥这... 最近,西红柿涨价的消息引发关注,“鸡蛋配不上西红柿”成为社交平台热议话题。西红柿价格究竟如何?引起价...
A股头条:三部门出手!换房退个... 资讯速递 1、财政部召开财政金融协同促内需一揽子政策全国推进工作视频会议 财政部13日下午会同有关部...
原创 银... 各位朋友,美股市场刚刚录得了连续第二个交易日的下跌。如果你觉得这仅仅是技术性调整,那可能低估了盘面下...
规模超23.8万亿,我国连续1... 当你在深夜滑动手机屏幕,一键下单心仪的商品时,你正在参与的,是一个连续13年称霸全球的庞大市场。 根...
南昌第五医院甲状腺科江辉:甲减... 一、高血脂 血脂并非全然有害,实际上,它是人体不可或缺的能量来源,并参与细胞膜的构建以及众多激素的合...
原创 海... 斑马消费 任建新 业绩再次下滑,管理问题频发,海底捞终于决定在人事上大动手术。 1月13日,创始人张...
大连牙齿矫正一般多少钱,面诊正... 大连牙齿矫正一般多少钱,面诊正畸医生要注意什么?面诊牙齿矫正是一个全面而细致的过程,应当充分准备,与...
财报透视|服不服?银之杰连续亏... 1月14日,银之杰(300085)发布公告,公司预计2025年度归母净利润为负值,公司2025年度经...
现货白银再创历史新高 1月14日,现货白银价格延续2025年以来的强劲涨势,盘中首次突破90美元/盎司大关,最高攀升至91...
海外巨头启示录系列(十七):S... SpaceX 由埃隆・马斯克于 2002 年创立,从初期濒临破产到如今估值达 8000 亿美元(拟 ...
阿斯利康与诺和诺德2026战略... 引言 在全球范围内,肥胖问题日益严重,成为影响人们健康的重要因素。根据世界卫生组织的数据显示,肥胖不...
北京国丹医院郑华国介绍:泛发型... 白癜风是临床常见的顽固皮肤疾病,可发生于任何年龄阶段,全身各部位均可能发病。泛发型白癜风作为其中一类...