美文网首页
防抖和节流中this的运用

防抖和节流中this的运用

作者: 遇一顽石 | 来源:发表于2020-12-17 15:03 被阅读0次

    防抖:触发高频事件,n秒后执行,如果n秒内再触发,重新计时

    function debounce(fn) {
         let timeout = null; // 创建一个标记用来存放定时器的返回值
         return function () {
           clearTimeout(timeout); // 每当用户输入的时候把前一个 setTimeout clear 掉
           timeout = setTimeout(() => { // 然后又创建一个新的 setTimeout, 这样就能保证输入字符后的 interval 间隔内如果还有字符输入的话,就不会执行 fn 函数
             fn.apply(this);
           }, 500);
         };
    }
     function sayHi() {
         console.log('防抖成功');
    }
    var inp = document.getElementById('inp');
    inp.addEventListener('input', debounce(sayHi)); // 防抖
    
    

    ps:this指向特殊几种情况:

    1,函数作为构造函数,this指向它实例对象
    2,函数作为对象属性被调用,this指向对象本身
    注意,如果fn函数不作为obj的一个属性被调用,会是什么结果呢?
    var obj = {
      x:10,
      y:function(){
        console.log(this);
        console.log(this.x);
      }
    }
    var fn1 = obj.fn;
    fn1(); // undefined
    如上代码,如果fn函数被赋值到了另一个变量中,并没有作为obj的一个属性被调用,那么this的值就是window,this.x为undefined。
    
    
    3,函数用call或者aply调用,this指向作为参数传入的对象(作用域的改变)

    call()、apply()、bind() 都是用来重定义 this 这个对象的! call() 返回一个新的函数;apply()、bind() 直接执行。 call() 、bind() 、 apply() 这三个函数的第一个参数都是 this 的指向对象。第二个参数差别就来了: call()、bind() 是直接放进去的,第二第三第 n 个参数全都用逗号分隔 apply() 所有参数必须放在一个数组里面传进去

    节流:触发高频事件,n秒内只执行一次,会稀释函数的执行频率

    function throttle(fn){
      let flag = true;
      return function(){//-通过闭包来保存一个标记-
         if(!flag) return;
         flag = false;
         fn.apply(this);
         setTimeout(()=>{
          flag = true
        },500)
      }
    }
    

    相关文章

      网友评论

          本文标题:防抖和节流中this的运用

          本文链接:https://www.haomeiwen.com/subject/xslngktx.html