面试官:什么是防抖和节流?有什么区别?如何实现? |
您所在的位置:网站首页 › 几和第几的区别是什么 › 面试官:什么是防抖和节流?有什么区别?如何实现? |
# 面试官:什么是防抖和节流?有什么区别?如何实现? # 一、是什么 本质上是优化高频率执行代码的一种手段 如:浏览器的 resize、scroll、keypress、mousemove 等事件在触发时,会不断地调用绑定在事件上的回调函数,极大地浪费资源,降低前端性能 为了优化体验,需要对这类事件进行调用次数的限制,对此我们就可以采用 防抖(debounce) 和 节流(throttle) 的方式来减少调用频率 # 定义 节流: n 秒内只运行一次,若在 n 秒内重复触发,只有一次生效 防抖: n 秒后在执行该事件,若在 n 秒内被重复触发,则重新计时一个经典的比喻: 想象每天上班大厦底下的电梯。把电梯完成一次运送,类比为一次函数的执行和响应 假设电梯有两种运行策略 debounce 和 throttle,超时设定为15秒,不考虑容量限制 电梯第一个人进来后,15秒后准时运送一次,这是节流 电梯第一个人进来后,等待15秒。如果过程中又有人进来,15秒等待重新计时,直到15秒后开始运送,这是防抖 # 代码实现 # 节流完成节流可以使用时间戳与定时器的写法 使用时间戳写法,事件会立即执行,停止触发后没有办法再次执行 function throttled1(fn, delay = 500) { let oldtime = Date.now() return function (...args) { let newtime = Date.now() if (newtime - oldtime >= delay) { fn.apply(null, args) oldtime = Date.now() } } } 1234567891011使用定时器写法,delay毫秒后第一次执行,第二次事件停止触发后依然会再一次执行 function throttled2(fn, delay = 500) { let timer = null return function (...args) { if (!timer) { timer = setTimeout(() => { fn.apply(this, args) timer = null }, delay); } } } 1234567891011可以将时间戳写法的特性与定时器写法的特性相结合,实现一个更加精确的节流。实现如下 function throttled(fn, delay) { let timer = null let starttime = Date.now() return function () { let curTime = Date.now() // 当前时间 let remaining = delay - (curTime - starttime) // 从上一次到现在,还剩下多少多余时间 let context = this let args = arguments clearTimeout(timer) if (remaining← 说说 Javascript 数字精度丢失的问题,如何解决? 如何判断一个元素是否在可视区域中? → |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |