美文网首页
笔记:防抖与节流(笔记摘抄)

笔记:防抖与节流(笔记摘抄)

作者: ForeverYoung_06 | 来源:发表于2019-10-09 11:39 被阅读0次

    掘金上的这篇文章介绍的很详细

    作者:jsliang
    链接:https://juejin.im/post/5c87b54ce51d455f7943dddb
    来源:掘金
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    在工作中,我们可能碰到这样的问题:用户在搜索的时候,在不停敲字,如果每敲一个字我们就要调一次接口,接口调用太频繁,给卡住了。用户在阅读文章的时候,我们需要监听用户滚动到了哪个标题,但是每滚动一下就监听,那样会太过频繁从而占内存,如果再加上其他的业务代码,就卡住了。所以,这时候,我们就要用到 防抖与节流 了。

    防抖:任务频繁触发的情况下,只有任务触发的间隔超过指定间隔的时候,任务才会执行。

    持续触发不执行
    不触发的一段时间之后再执行

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>防抖</title>
    </head>
    <body>
      <button id="debounce">点我防抖!</button>
    
      <script>
        window.onload = function() {
          // 1、获取这个按钮,并绑定事件
          var myDebounce = document.getElementById("debounce");
          myDebounce.addEventListener("click", debounce(sayDebounce));
        }
    
        // 2、防抖功能函数,接受传参
        function debounce(fn) {
          // 4、创建一个标记用来存放定时器的返回值
          let timeout = null;
          return function() {
            // 5、每次当用户点击/输入的时候,把前一个定时器清除
            clearTimeout(timeout);
            // 6、然后创建一个新的 setTimeout,
            // 这样就能保证点击按钮后的 interval 间隔内
            // 如果用户还点击了的话,就不会执行 fn 函数
            timeout = setTimeout(() => {
              fn.call(this, arguments);
            }, 1000);
          };
        }
    
        // 3、需要进行防抖的事件处理
        function sayDebounce() {
          // ... 有些需要防抖的工作,在这里执行
          console.log("防抖成功!");
        }
    
      </script>
    </body>
    </html>
    
    

    节流:指定时间间隔内只会执行一次任务。

    1.持续触发并不会执行多次2.到一定时间再去执行
    节流的意思是让函数有节制地执行,而不是毫无节制的触发一次就执行一次。什么叫有节制呢?就是在一段时间内,只执行一次。

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>节流</title>
    </head>
    <body>
    
      <button id="throttle">点我节流!</button>
    
      <script>
        window.onload = function() {
          // 1、获取按钮,绑定点击事件
          var myThrottle = document.getElementById("throttle");
          myThrottle.addEventListener("click", throttle(sayThrottle));
        }
    
        // 2、节流函数体
        function throttle(fn) {
          // 4、通过闭包保存一个标记
          let canRun = true;
          return function() {
            // 5、在函数开头判断标志是否为 true,不为 true 则中断函数
            if(!canRun) {
              return;
            }
            // 6、将 canRun 设置为 false,防止执行之前再被执行
            canRun = false;
            // 7、定时器
            setTimeout( () => {
              fn.call(this, arguments);
              // 8、执行完事件(比如调用完接口)之后,重新将这个标志设置为 true
              canRun = true;
            }, 1000);
          };
        }
    
        // 3、需要节流的事件
        function sayThrottle() {
          console.log("节流成功!");
        }
    
      </script>
    </body>
    </html>
    
    

    那么,节流在工作中的应用?

    懒加载要监听计算滚动条的位置,使用节流按一定时间的频率获取。
    用户点击提交按钮,假设我们知道接口大致的返回时间的情况下,我们使用节流,只允许一定时间内点击一次。

    防抖是将多次执行变为最后一次执行,节流是将多次执行变为在规定时间内只执行一次.一般不会重置定时器.

    相关文章

      网友评论

          本文标题:笔记:防抖与节流(笔记摘抄)

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