节流防抖之我见

其实节流防抖我们一直都有接触,但是可能就是不知道它原来叫这个。

一、防抖

定义:在一段时间内触发了n次,但只有一次生效,一般都是开头那次或者结尾的。

应用场景:比如scroll事件或则resize,但是频繁地监听是浪费性能的,所以最好就是做个定时器,如果重复监听到这个事件就清除定时器,取消前面的事件。

 // 防抖
    function deBounce(func, wait) {
      let timeID;

      return function () {
        clearInterval(timeID);

        timeID = setTimeout(func, wait)
      }
    }

    function onScroll() {
      console.log('scrolling~');
    }

    window.addEventListener('scroll', deBounce(onScroll, 1000));

 

二、节流

定义:一段时间内只允许执行一次

应用场景:如scroll事件,scroll如果不做限制,则会不断执行事件,如果事件里还包含了操作dom或者里面还有回调事件,将会大大地增加浏览器的压力,降低用户体验。解决方法可以使用时间戳,第一次点击时响应事件,接下来的再重复触发了事件的话则会1s后再执行事件。

// 节流
    function throttle(func, waitTime) {
      let previous = 0;

      return function (...args) {
        let that = this;
        let now = new Date().getTime();

        if (now - previous > waitTime) {
          func.apply(that, args);
          previous = now;
        }
      }
    }

    function handle() {
      console.log('scrolled')
    }
    window.addEventListener('scroll', throttle(handle, 1000));

 

总结:他们的区别是:防抖就像游戏里的法师施法,可能一直被打断,而节流却是在规定的时间内一定会执行的。比如像scroll事件,你不能真的就一定要等到用户停下滚动才发送请求,不然体验不好,在合理的时间内就该发起请求。

posted @ 2019-10-30 16:16  Sofiaღ  阅读(188)  评论(0编辑  收藏  举报