2024年最全10分钟快速理解JS的节流、防抖,该如何高效实用Kotlin

总结

根据路线图上的重点去进行有针对性的学习,在学习过程中,学会写笔记,做总结。

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

这里分享一些前端学习笔记:

  • html5 / css3 学习笔记

  • JavaScript 学习笔记

  • Vue 学习笔记

let boom = function () {

console.log(‘boom boom boom’,new Date().Format(‘HH:mm:ss’))

}

setInterval(debounce(biu,500),1000)

setInterval(debounce(boom,2000),1000)

看一下运行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xnKT3bbx-1617719777296)(js防抖和节流.assets/165a252b4b809a23)]

分析:这个🌰就很好的解释了,如果在时间间隔内执行函数,会重新触发计时。biu会在第一次1.5s执行后,每隔1s执行一次,而boom一次也不会执行。因为它的时间间隔是2s,而执行时间是1s,所以每次都会重新触发计时

个人理解: 函数防抖就是法师发技能的时候要读条,技能读条没完再按技能就会重新读条。最后放出的技能是最后一次放出来。

函数节流(throttle)

函数节流(throttle)

当持续触发事件时,保证一定时间段内只调用一次事件处理函数。节流通俗解释就比如我们水龙头放水,阀门一打开,水哗哗的往下流,秉着勤俭节约的优良传统美德,我们要把水龙头关小点,最好是如我们心意按照一定规律在某个时间间隔内一滴一滴的往下滴。如下图,持续触发scroll事件时,并不立即执行handle函数,每隔1000毫秒才会执行一次handle函数。

归纳:规定在一个单位时间内,只能触发一次函数。如果这个单位时间内触发多次函数,只有一次生效

对于节流,一般有两种方式可以实现,分别是时间戳版和定时器版。

时间戳:

function throttle(func, wait) {

var previous = 0;

return function() {

let now = Date.now();

let context = this;

let args = arguments;

if (now - previous > wait) {

func.apply(context, args);

previous = now;

}

}

}

定时器版:

function throttle(func, wait) {

let timeout;

return function() {

let context = this;

let args = arguments;

if (!timeout) {

timeout = setTimeout(() => {

timeout = null;

func.apply(context, args)

}, wait)

}

}

}

我们应该可以很容易的发现,其实时间戳版和定时器版的节流函数的区别

  • 时间戳版的函数触发是在时间段内开始的时候

  • 而定时器版的函数触发是在时间段内结束的时候。

如果我们想要第一次触发是在时间段内开始的时候,但希望最后一次触发有效,即最后一次不管是不是在规定时间内点击的,但也让他在规定时间内触发。

我们来看另外的一个🌰(时间戳+定时器)

function throttle(fun, delay) {

let last, deferTimer

return function (args) {

let that = this

let _args = arguments

let now = +new Date()

if (last && now < last + delay) {

clearTimeout(deferTimer)

deferTimer = setTimeout(function () {

last = now

fun.apply(that, _args)

}, delay+last-now)

}else {

last = now

fun.apply(that,_args)

}

}

}

let throttleAjax = throttle(ajax, 1000)

let inputc = document.getElementById(‘throttle’)

inputc.addEventListener(‘keyup’, function(e) {

throttleAjax(e.target.value)

})

看一下运行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JiuaD72b-1617719777299)(js防抖和节流.assets/165a252b4c1a9686)]

可以看到,我们在不断输入时,ajax会按照我们设定的时间,每1s执行一次。

结合刚刚biubiubiu的🌰:

let biubiu = function () {

console.log(‘biu biu biu’, new Date().Format(‘HH:mm:ss’))

}

setInterval(throttle(biubiu,1000),10)

在这里插入图片描述

不管我们设定的执行时间间隔多小,总是1s内只执行一次。

个人理解 : 函数节流就是fps游戏的射速,就算一直按着鼠标射击,也只会在规定射速内射出子弹。

总结

=====================================================================

  • 函数防抖和函数节流都是防止某一时间频繁触发,但是这两兄弟之间的原理却不一样。

  • 函数防抖是某一段时间内只执行一次,而函数节流是间隔时间执行。

  • 「防抖重在清零 clearTimeout(timer)」「节流重在开关锁 now 是否大于last + delay

最直白的话

  • 防抖:就是一定时间内,只会执行最后一次任务;

  • 原理是维护一个计时器,规定在delay时间后触发函数,但是在delay时间内再次触发的话,就会取消之前的计时器而重新设置。这样一来,只有最后一次操作能被触发。

  • 节流:就是一定时间内,只执行一次 ;

  • 原理是通过判断是否到达一定时间来触发函数。

  • 前者就是清除计时器,后者就是等计时器执行完当前任务之后,才会执行下一次任务 ;

读者福利

========

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

由于篇幅过长,就不展示所有面试题了,想要完整面试题目的朋友(另有小编自己整理的2024大厂高频面试题及答案附赠)


  • 30
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值