zoukankan      html  css  js  c++  java
  • js性能提升之函数的防抖和节流

    之前看到小伙伴的总结上提到了这个,当时没放在心上后来总觉得应该看一看,不看不知道一看吓一跳,原来这个东西这么有用
     
    函数的防抖和节流,都是优化高频率执行js代码的方法,具体来说:
    函数防抖:是在频繁触发的情况下,只有满足一定的时间,才会执行一次代码。
    函数节流:是指一定时间内js方法只跑一次,例如人眨眼睛,一定时间内只眨一次。
    使用场景:
    函数防抖:多数用在用户注册时手机号和邮箱验证,只有用户输入完成后,前端才需要检测格式是否正确,如果不正确,再弹出提示语。包括发送验证码,同样是要求一定时间后才能再次操作。
    函数节流:多数在监听页面元素滚动事件的时候会用到,因为滚动事件是一个高频触发的事件。
     
    简单实现:
      
    函数防抖:

    重点是需要一个setTimeout来辅助实现,延迟执行需要跑的代码,如果方法多次触发,则把上次记录的延迟执行代码用clearTimeout清除掉,重新开始,如果计时完毕,没有方法来访问触发,就执行代码。

    // 定义一个常量,接收一个函数和延迟时间作为参数
            const debounce = (fn,delay) => {
                // 定义一个空变量
                let timer = null;
                // 为了保证this指向,返回一个箭头函数
                return (...args) => {
                    // 每次走进来清理定时器
                    clearTimeout(timer);
                    // 设置定时器
                    timer = setTimeout(() => {
                        // 调用apply方法绑定this指向
                        fn.apply(this,args);
                        // 设置延迟时间
                    },delay)
                }
            }
    函数节流:

    重点是,声明一个变量当标志位,记录当前代码是否在执行,如果空闲,就正常触发方法执行,如果代码正在执行,就取消这次执行,直接return。

     // 定义一个函数,接收函数作为参数,同时设定要求时间
            const throttle = (fn, delay = 500) => {
                // 设置变量默认为true
                let flag = true;
                // 为了保证this指向,返回一个箭头函数
                return (...args) => {
                    // 判断如果已经在执行就直接return
                    if (!flag) return;
                    // 否则就是没有执行,将状态赋值为false
                    flag = false;
                    // 设置定时器,设置时间
                    setTimeout(() => {
                        // 调用apply方法确保this指向问题
                        fn.apply(this,args);
                        // 最后将状态重新更改为true,以便程序下次执行
                        flag = true;
                    },delay)
                };
            };
    转自他人链接:https://www.jianshu.com/p/c00d89c15554



  • 相关阅读:
    C++ 面向对象高级开发 -- static
    C++ 面向对象高级开发 -- complex 类的实现
    单独编译PCL的kdtree模块报错“undefined reference to”
    【C++】预处理指令#define,#ifdef,#ifndef,#endif ...
    点云配准(Registration)算法——以PCL为例
    算法岗求职资料汇总
    C++面向对象高级开发
    opencv的常用头文件
    ubuntu下,VSCode采用cmake编译C++工程
    "error while loading shared libraries: xxx.so.x" 错误的原因和解决办法
  • 原文地址:https://www.cnblogs.com/fdd-111/p/12033479.html
Copyright © 2011-2022 走看看