面试一:函数防抖与节流

概念

函数防抖(debounce)

函数防抖,就是指触发事件后在 n 秒内函数只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间。

简单的说,当一个动作连续触发,则只执行最后一次。

打个比方,坐公交,司机需要等最后一个人进入才能关门。每次进入一个人,司机就会多等待几秒再关门。

函数节流(throttle)

限制一个函数在一定时间内只能执行一次。

举个例子,乘坐地铁,过闸机时,每个人进入后3秒后门关闭,等待下一个人进入。

为了方便理解,我们首先通过一个可视化的工具,感受一下三种环境(正常情况、函数防抖情况 debounce、函数节流 throttle)下,对于mousemove事件回调的执行情况。


常见应用场景

函数防抖的应用场景

连续的事件,只需触发一次回调的场景有:

搜索框搜索输入。只需用户最后一次输入完,再发送请求

手机号、邮箱验证输入检测

窗口大小Resize。只需窗口调整完成后,计算窗口大小。防止重复渲染。

函数节流的应用场景

间隔一段时间执行一次回调的场景有:

滚动加载,加载更多或滚到底部监听

谷歌搜索框,搜索联想功能

高频点击提交,表单重复提交

异同比较

相同点:

都可以通过使用setTimeout实现。

目的都是,降低回调执行频率。节省计算资源。

不同点:

函数防抖,在一段连续操作结束后,处理回调,利用 clearTimeout 和 setTimeout 实现。函数节流,在一段连续操作中,每一段时间只执行一次,频率较高的事件中使用来提高性能。

函数防抖关注一定时间连续触发,只在最后执行一次,而函数节流侧重于一段时间内只执行一次。

总结

最后,总结一下函数防抖与函数节流的区别。函数防抖,将多次执行的事件合并成一次。函数节流,保持一段时间执行一次。推荐阅读「涂鸦码龙」翻译的这篇 - 实例解析防抖动(Debouncing)和节流阀(Throttling),加深理解。文章丰富的实例,可深刻感受一下两者的区别。

在不是很理解debounce的API的情况下,直接阅读lodash源码,花了2个晚上看得懂云里雾里。后面,重新阅读API文档,弄明白了leading和trailing的目的。很快就看懂了debounce的源码。因此,建议阅读源码前,先理解API中各个参数的用处。带着目的看源码会容易一些。

你可能感兴趣的:(面试一:函数防抖与节流)