-
Notifications
You must be signed in to change notification settings - Fork 1.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
面试官:什么是防抖和节流?有什么区别?如何实现? #83
Comments
写反了 |
没写反啊 |
精确的节流函数中 |
精确的节流函数中
最后的timer有误,需要带参数执行,而且starttime应该重置为当前。 |
防抖只执行一次,节流顾名思义减少执行次数 |
为什么这两个在调用时,都需要绑定this呢?是否有必要呢? |
有的,这样你回调函数中的上下文就一样了 |
一、是什么
本质上是优化高频率执行代码的一种手段
如:浏览器的
resize
、scroll
、keypress
、mousemove
等事件在触发时,会不断地调用绑定在事件上的回调函数,极大地浪费资源,降低前端性能为了优化体验,需要对这类事件进行调用次数的限制,对此我们就可以采用
throttle
(防抖)和debounce
(节流)的方式来减少调用频率定义
一个经典的比喻:
想象每天上班大厦底下的电梯。把电梯完成一次运送,类比为一次函数的执行和响应
假设电梯有两种运行策略
debounce
和throttle
,超时设定为15秒,不考虑容量限制电梯第一个人进来后,15秒后准时运送一次,这是节流
电梯第一个人进来后,等待15秒。如果过程中又有人进来,15秒等待重新计时,直到15秒后开始运送,这是防抖
代码实现
节流
完成节流可以使用时间戳与定时器的写法
使用时间戳写法,事件会立即执行,停止触发后没有办法再次执行
使用定时器写法,
delay
毫秒后第一次执行,第二次事件停止触发后依然会再一次执行可以将时间戳写法的特性与定时器写法的特性相结合,实现一个更加精确的节流。实现如下
防抖
简单版本的实现
防抖如果需要立即执行,可加入第三个参数用于判断,实现如下:
二、区别
相同点:
setTimeout
实现不同点:
clearTimeout
和setTimeout
实现。函数节流,在一段连续操作中,每一段时间只执行一次,频率较高的事件中使用来提高性能例如,都设置时间频率为500ms,在2秒时间内,频繁触发函数,节流,每隔 500ms 就执行一次。防抖,则不管调动多少次方法,在2s后,只会执行一次
如下图所示:
三、应用场景
防抖在连续的事件,只需触发一次回调的场景有:
resize
。只需窗口调整完成后,计算窗口大小。防止重复渲染。节流在间隔一段时间执行一次回调的场景有:
The text was updated successfully, but these errors were encountered: