js 防抖动

问题:针对频繁触发scoll resize绑定的事件函数,有可能短时间多次触发时事件,影响性能。
思路:多个函数调用合成一次,给定时间后仅调用最后一次

  
  // 包装事件的debounce函数
  debounce = (func, delay)=>{
    let timer = null;    
    console.log('this,',this);

    const _that = this;
    return function(){
      console.log('this,',this);
      console.log('_that,',_that);
      let context = _that; // 通过 ‘this’ 和 ‘arguments’ 获取函数的作用域和变量
      let args = arguments; 
      clearTimeout(timer);
      timer = setTimeout(()=>{
        func.apply(context, args);
      }, delay)
    }();
  }

  // 当用户滚动时被调用的函数
  foo = ()=>{
    console.log("todo somethind");
    console.log('this,',this);
  }
  
  handleScroll = () => {
      // 元素绑定scoll事件,触发包装函数debounce
    this.debounce(this.foo, 100);

  }
  
  componentWillUnmount() {
    window.removeEventListener('scroll', this.handleScroll);
  }

  componentDidMount = async () => {

    window.addEventListener('scroll', this.handleScroll);
  }
  

参考:
https://codepen.io/ribuluo000/pen/MWgqpZV

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  •   JavaScript 与 HTML 之间的交互是通过事件实现的。   事件,就是文档或浏览器窗口中发生的一些特...
    霜天晓阅读 3,581评论 1 11
  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 5,281评论 0 21
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,554评论 1 51
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,171评论 1 32
  • 背景 我们在开发的过程中会经常使用如scroll、resize、touchmove等事件,如果正常绑定事件处理函数...
    wclimb阅读 684评论 0 6