面试必备知识点之节流防抖

防抖策略(debounce)

当事件被触发后,延迟n秒后再执行回调,如果在这n秒内事件又被触发,则重新计时。

通俗理解(LOL中的回城机制,在施法的时候不可以被打断,不然重新施法)

好处:能够保证用户在频繁触发某些事件的时候,不会频繁的执行回调,只会被执行一次

举个爪:实现输入框的防抖

//防抖动的timer
//定义防抖动的函数,函数里面定义一个延时器,在延时器里面调用发起JSON的请求
//在触发keyup事件时,立即清空timer,然后调用防抖的函数

var timer = null // 1. 防抖动的 timer
function debounceSearch(keywords) { // 2. 定义防抖的函数
     timer = setTimeout(function() {
     // 发起 JSONP 请求
     getSuggestList(keywords)
     }, 500)
 }
$('#ipt').on('keyup', function() { // 3. 在触发 keyup 事件时,立即清空 timer
 clearTimeout(timer)
 // ...省略其他代码
 // 为输入框绑定 keyup 事件
 // $('#ipt').on('keyup', function () {
 // 3. 清空 timer
 // clearTimeout(timer)
 // var keywords = $(this).val().trim()
 // if (keywords.length <= 0) {
 //   return $('#suggest-list').empty().hide()
 // }

 // 先判断缓存中是否有数据
 // if (cacheObj[keywords]) {
 //   return renderSuggestList(cacheObj[keywords])
 // }

 // TODO:获取搜索建议列表
 // console.log(keywords)
 // getSuggestList(keywords)
 debounceSearch(keywords)
 })

节流策略(throttle)

可以减少一段时间内事件触发的频率。

节流的应用场景

① 鼠标连续不断地触发某事件(如点击),只在单位时间内只触发一次;

② 懒加载时要监听计算滚动条的位置,但不必每次滑动都触发,可以降低计算的频率,而不必去浪费 CPU 资源;

③通俗理解:王者荣耀中的平A,有个攻速限制,按得再快也没有。

节流阀

字面上理解就是一个开关,也只是一个优化的作用。

举个爪:使用节流阀优化鼠标跟随效果

- 预定义一个 timer 节流阀
- 当设置了鼠标跟随效果后,清空 timer 节流阀,方便下次开启延时器
- 执行事件的时候判断节流阀是否为空,如果不为空,则证明距离上次执行间隔不足16毫秒
$(function() {
     var angel = $('#angel')
     var timer = null // 1.预定义一个 timer 节流阀
     $(document).on('mousemove', function(e) {
     if (timer) { return } // 3.判断节流阀是否为空,如果不为空,则证明距离上次执行间隔不足16毫秒
     timer = setTimeout(function() {
     $(angel).css('left', e.pageX + 'px').css('top', e.pageY + 'px')
     timer = null // 2.当设置了鼠标跟随效果后,清空 timer 节流阀,方便下次开启延时器
     }, 16)
     })
})

防抖与节流的区别

  • 防抖:如果事件被频繁触发,防抖能保证只有最有一次触发生效!前面 N 多次的触发都会被忽略!

  • 节流:如果事件被频繁触发,节流能够减少事件触发的频率,因此,节流是有选择性地执行一部分事件!

你可能感兴趣的:(前端,Ajax)