1. 首页

坚持造轮子第二天 – 防抖与节流 – 内藏妹子福利

坚持造轮子第二天 - 防抖与节流 - 内藏妹子福利

福利在此

www.bilibili.com/video/bv1Tr…

二话不说 轮子我都会造 还怕你面试问吗? 一天造一个轮子,干就完了。

看点

  • 针对大厂笔试、面试必考手写题目

  • TDD方式开发

  • 配合视频讲解

造轮子计划

(计划赶不上变化 随时迭代 欢迎留言 随时摸鱼)

  • 框架基础

    防抖和节流

    防抖和节流可以说是一对好基友,也是前端面试的手写热点考题。防抖和节流其实都是在规避频繁触发回调导致大量计算,从而影响页面发生抖动甚至卡顿。简单的说将多次回调比如页面点击或ajax调用变为一次。防抖和节流的区别在于以第一次为准还是最后一次为准。

    需求

    Js中文网 – 前端进阶资源教程 www.javascriptC.com,typescript 中文文档
    Javascript中文网是以前端进阶资源教程分享为主的专业网站,包括:前端、大厂面试题、typescript教程、程序人生、React.js……等,以帮助开发者成长为愿景的社区

    1. 节流Throttle – 调用多次、只第一次调用有效

    在一段时间内,不论触发多少次调用,都以第一次为准。 输入框补全提示,只需要每两秒补全一次。

    用测试用例表示

    it("节流Throttle", (done) => {
    const { throttle } = require("../index");
    // 定义一个Mock函数
    const mockFn = jest.fn();
    // 封装为节流方法
    const fn = throttle(mockFn, 10);
    // 同步调用两次
    fn(1);
    fn(2);
    setTimeout(() => {
    const calls = mockFn.mock.calls;
    // 断言 mock方法只调用一次
    expect(calls.length).toBe(1);
    // 根据参数判断以第一次调用为准
    expect(calls[0][0]).toBe(1);
    done();
    }, 50);
    }); 复制代码

    2. 防抖Debounce 最后一次为准

    在一段时间内,不论触发多少期回调,都已最后一次为准。 比如:以用户拖拽改变窗口大小,触发 resize 事件为例,会触发组件重新布局,这里面只有最后一次调用是有意义的。

    it("防抖Debounce", (done) => {
    const { debounce } = require("../index");
    const mockFn = jest.fn();
    // 封装一个防抖函数
    const fn = debounce(mockFn, 10);
    // 连续两次调用
    fn(1);
    fn(2);
    setTimeout(() => {
    const calls = mockFn.mock.calls;
    // 断言只调用一次
    expect(calls.length).toBe(1);
    // 断言以最后一次调用为准
    expect(calls[0][0]).toBe(2);
    done();
    }, 50);
    }); 复制代码

    功能实现

    节流

    主要思路利用时间戳判断,每次调用判断和上一次调用的时间差异确定是否需要调用。 throttle实际是一个工厂函数,可以将一个函数封装为一个带有节流功能的函数。

    module.exports.throttle = (fn, delay) => {
    // 定义上次触发时间
    let last = 0;
    return (...args) => {
    const now = + Date.now();
    console.log("call", now, last, delay);
    if (now > last + delay) {
    last = now;
    fn.apply(this, args);
    }
    };
    }; 复制代码

    防抖

    实现的话可以使用定时器执行函数,新调用发生时如果旧调用没有执行就清除之前的定时器。

    `/**

    • 防抖Debounce
      */
      module.exports.debounce = (fn, delay) => {
      let timer;
      return (…args) => {
      // 判断定时器是否存在,清除定时器
      if (timer) {
      clearTimeout(timer);
      }
      // 重新调用setTimeout
      timer = setTimeout(() => {
      fn.apply(this, args);
      }, delay);
      };
      }; 复制代码`

    测试

    坚持造轮子第二天 - 防抖与节流 - 内藏妹子福利

    OK 任务完成

    关注全栈然叔 带你坚持天天造轮子 (周末休息 拒绝996)

    本文使用 mdnice 排版

作者:全栈然叔
链接:https://juejin.im/post/6885250789825052679

看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「画漫画的程序员」,公众号后台回复「资源」 免费领取我精心整理的前端进阶资源教程

JS中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。欢迎热爱技术的你一起加入交流与学习,JS中文网的使命是帮助开发者用代码改变世界

本文著作权归作者所有,如若转载,请注明出处

转载请注明:文章转载自「 Js中文网 · 前端进阶资源教程 」https://www.javascriptc.com

标题:坚持造轮子第二天 – 防抖与节流 – 内藏妹子福利

链接:https://www.javascriptc.com/4569.html

« 程序员必备的计算机网络基础知识总结
一个基于 Vue 3 + Vant 3 的开源商城项目»
Flutter 中文教程资源

相关推荐

QR code