【前端面经】手写一个防抖、节流

防抖、节流及其实现

防抖(Debounce)和节流(Throttle)是两种常见的优化技术,用于控制函数的执行频率,特别是在处理频繁触发的事件时,如窗口调整大小、滚动、输入框输入等。这些技术可以提高性能和用户体验,避免不必要的函数调用。

防抖(Debounce)

防抖是一种确保函数在特定时间间隔内只执行一次的技术。如果在这段时间内函数再次被调用,定时器会重新计时。

  • 适用场景:防抖适用于用户输入(如搜索框实时查询),窗口调整大小事件等。在这些场景中,函数应该在用户停止操作后的某个时间段内只执行一次

    • 搜索框输入用户输入停止后再进行搜索请求,避免每次输入都发送请求。
    • 窗口大小调整:用户停止调整窗口大小后再执行调整后的逻辑。
  • 实现原理:使用一个定时器,每次触发事件时重置定时器,只有当定时器到期时才执行函数

  • 示例代码

    function debounce(func, wait) {
      let timeout;
      return function (...args) {
        clearTimeout(timeout);
        timeout = setTimeout(() => func.apply(this, args), wait);
      };
    }
    
    // 用法示例:实时搜索输入框
    const searchInput = document.getElementById('search');
    searchInput.addEventListener('input', debounce(() => {
      // 执行搜索查询
      console.log('Searching...');
    }, 300));
    

节流(Throttle)

节流是一种确保函数在特定时间间隔内只执行一次的技术,不管这段时间内函数被调用了多少次

  • 应用场景:节流适用于需要持续响应用户行为的事件,如滚动、鼠标移动等。在这些场景中,函数应该在一定时间间隔内多次执行,但不会频繁地触发。

    • 滚动事件:限制滚动事件处理器的执行频率,减少滚动时执行逻辑的次数
    • 按钮点击:防止按钮被短时间内频繁点击,导致多次触发事件。
  • 实现原理:使用一个定时器或者时间戳,在特定时间间隔内只允许函数执行一次

  • 示例代码

    function throttle(func, wait) {
      let lastTime = 0;
      return function (...args) {
        const now = Date.now();
        if (now - lastTime >= wait) {
          lastTime = now;
          func.apply(this, args);
        }
      };
    }
    
    // 用法示例:窗口滚动事件
    window.addEventListener('scroll', throttle(() => {
      // 执行滚动处理
      console.log('Scrolling...');
    }, 200));
    

防抖和节流的区别

  • 防抖确保函数在一段时间内不被重复调用。如果在这段时间内再次调用,会重新计时。适合用户停止操作后才需要执行的场景。

  • 节流确保函数在一段时间内至多执行一次,不管这段时间内调用了多少次。适合需要持续响应用户操作但不希望频繁触发的场景。

### 前端面试经验和常见问题 #### Vue.js 的重要性和应用场景 对于希望在前端开发领域寻求更多机会和发展的人来说,Vue.js 是一种值得深入学习的技术。作为一种渐进式框架,Vue.js 不仅易于上手,而且功能强大,能够帮助开发者构建复杂的单页应用程序(SPA)[^1]。 #### CSS Reset 和 Normalize.css 的差异及其应用场合 CSS Reset 旨在移除所有默认样式,使得网页元素呈现一致的基础外观;而 Normalize.css 则专注于跨浏览器一致性优化,保留有用的默认样式并修正已知的显示错误。选择哪一个取决于具体需求——如果追求绝对统一,则倾向于者;若需保持部分原生特性的同时解决兼容性难题,则后者更为合适[^2]。 #### Content-Disposition Header 的作用 当服务器向客户端发送文件下载请求时,`Content-Disposition` HTTP头部字段用于指示浏览器应如何处理接收到的内容。此头信息可指定文件名以及建议保存方式(作为附件还是直接打开),从而影响用户体验和交互逻辑[^3]。 #### Bootstrap 网格系统的机制解析 Bootstrap 提供了一套灵活且高效的响应式网格系统,允许设计者轻松实现自适应布局方案。该系统基于弹性盒模型(flexbox),支持多达十二列宽度划分,并提供了多种预设断点设置以满足不同终端设备的需求。利用`.container`, `.row` 及各类`.col-*` 类组合即可迅速搭建起美观实用的多平台界面结构[^4]. ```html <div class="container"> <div class="row"> <div class="col-md-8">.col-md-8</div> <div class="col-md-4">.col-md-4</div> </div> </div> ``` #### 面试技巧总结 为了提升自己在前端技术岗位上的竞争力,除了扎实掌握上述知识点外,还应该注重培养解决问题的能力、团队协作精神和技术文档撰写水平等方面素质。同时也要关注行业动态,紧跟最新趋势变化,不断更新自己的技能树。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值