`
winxpxt
  • 浏览: 28363 次
  • 性别: Icon_minigender_2
  • 来自: 厦门
社区版块
存档分类

JavaScript函数节流与函数去抖

 
阅读更多

首先解释一下这两个概念:

函数节流(throttle):是让一个函数无法在很短的时间间隔内连续调用,当上一次函数执行后过了规定的时间间隔,才能进行下一次该函数的调用。

函数去抖(debounce):让一个函数在一定间隔内没有被调用时,才开始执行被调用方法。

两个方法都是用来提升前端性能,减轻浏览器压力。

应用

理解起来有点费力,通过应用来理解就轻松了。通常,我们会在有用户交互参与的地方添加事件,而往往这种事件会被频繁触发。

  • 想象一下窗口的resize事件或者是一个元素的onmousemove事件,resize会在改变浏览器大小事连续触发、onmousemove会在鼠标移动时被连续触发,如果你的回调过重,你可能使浏览器死掉。
  • 想象一下你需要在用户输入一段文字时对文字进行处理,你监听文字改变,每一次改变都会调用一次回调函数,其实我需要的是在用户输入停下来的时候去处理一次。
  • 射击游戏中你希望1s中之内只能发射一颗子弹,而不是用户每按一次发射就发射。

类似的应用还有很多,throttle和debounce的区别就是在频繁的回调中,throttle以一定频率运行,而debounce在频繁回调之后运行。总的来说就是过滤频繁触发的事件回调,使其在真正需要的时候执行,两者根据应用场景自行选择。

实现

说了这么多,怎么使用debounce和throttle功能呢,伟大的 http://underscorejs.org 给我们实现好了这两个方法,这两个方法的实现都是不依赖于其他underscore方法的,所以我们可以轻易的添加到其他JavaScript库中,比如jQuery。

debounce   

这里暂时不考虑immediate,有兴趣可以自己研究。

函数去抖的基本思想是:对需要去抖的函数做包装,使用闭包记录timeout,第一次回调给函数设置 setTimeout定时器,只要在wait时间内,后一次的回调会clearTimeout取消前一次回调的执行。

复制代码
_.debounce = function(func, wait, immediate) {
    var timeout, result;
    return function() {
      var context = this, args = arguments;
      var later = function() {
        timeout = null;
        if (!immediate) result = func.apply(context, args);
      };
      var callNow = immediate && !timeout;
      clearTimeout(timeout);
      timeout = setTimeout(later, wait);
      if (callNow) result = func.apply(context, args);
      return result;
    };
  };
复制代码

throttle 

函数节流的基本思想是:无视浏览器的回调,自己按一定频率执行代码。

复制代码
_.throttle = function(func, wait) {
    var context, args, timeout, result;
    var previous = 0;
    var later = function() {
      previous = new Date;
      timeout = null;
      result = func.apply(context, args);
    };
    return function() {
      var now = new Date;
      var remaining = wait - (now - previous);
      context = this;
      args = arguments;
      if (remaining <= 0) {
        clearTimeout(timeout);
        timeout = null;
        previous = now;
        result = func.apply(context, args);
      } else if (!timeout) {
        timeout = setTimeout(later, remaining);
      }
      return result;
    };
  };
复制代码

 

0
2
分享到:
评论

相关推荐

    javaScript函数节流与防抖之区别

    函数节流(throttle)和函数防抖(debounce)是JavaScript性能优化的重要技巧,它们主要用于处理频繁触发的事件,如窗口滚动、页面加载、输入框输入等场景。 **函数防抖(debounce)** 是一种策略,其主要目的是在...

    JavaScript函数节流和函数防抖之间的区别.docx

    JavaScript函数节流和防抖是两种常见的性能优化技术,它们主要用于限制函数在特定时间段内的执行频率,以提高应用的响应速度和用户体验。这两种技术在处理高频率触发的事件,如页面滚动、窗口大小改变、输入框实时...

    优化性能:JavaScript中防抖与节流函数的实现与应用

    节流函数实现中,通常会使用一个标志变量来控制函数是否在冷却时间内,如果标志变量表示函数处于冷却状态,则不执行函数;如果标志变量表示函数已脱离冷却状态,则执行函数,并启动下一次冷却计时。 在实际应用中,...

    JavaScript函数节流概念与用法实例详解

    JavaScript函数节流是一种优化技术,主要用于处理高频率触发的事件,如窗口的`resize`或鼠标的`mousemove`事件。这种技术的目的是限制函数的执行次数,以避免在短时间内过度消耗资源,比如频繁的DOM操作或网络请求。...

    JavaScript函数节流和函数去抖知识点学习

    JavaScript中的函数节流(throttle)和函数去抖(debounce)是两种常见的优化策略,它们主要用于处理频繁触发的事件,如窗口滚动、输入验证、页面加载等,以提高性能和用户体验。 **函数节流(throttle)**: 函数...

    函数节流实现,通过原生方法实现

    函数节流案例

    JavaScript函数节流的两种写法

    JavaScript函数节流是一种控制函数在一定时间间隔内仅被触发一次的技术,旨在优化前端性能,尤其在处理高频事件(如窗口resize、滚动、连续的鼠标移动等)时防止过多的函数调用。函数节流的核心思想是确保函数不会在...

    浅谈JavaScript函数节流

    JavaScript函数节流是一种优化技术,主要用于控制函数执行的频率,以避免在高频率触发的事件(如窗口resize、滚动或触摸移动)中过度消耗系统资源,尤其是DOM操作。这种技术对于提升网页性能至关重要,因为它可以...

    Vue中函数防抖节流的理解及应用实现

    Vue中的函数防抖和节流是优化性能的重要技术手段,主要应用于处理频繁触发的事件,如输入搜索、滚动、...同样,我们也可以使用节流函数来处理类似的需求,例如在页面滚动事件中,通过节流来控制获取滚动位置的频率。

    js代码-函数节流与防抖

    在JavaScript编程中,...通过理解和应用函数节流与防抖,开发者可以编写出更加高效、响应更快的JavaScript代码,提高用户体验。在实际项目中,合理地运用这些技巧,可以显著改善性能,尤其是在资源有限的移动设备上。

    javascript实现节流和防抖

    例如,一个简单的节流函数实现如下: ```javascript function throttle(func, delay) { let timeoutId; return function() { const context = this; const args = arguments; if (!timeoutId) { timeoutId = ...

    防抖节流函数js封装模块

    防抖(debounce)和节流(throttle)是常用的两个 JavaScript 函数优化技术,它们可以帮助我们避免在高频率事件触发时导致的性能问题。 防抖和节流的主要区别在于它们处理事件触发的方式不同。防抖在事件触发后等待...

    vue中使用防抖和节流

    本文将详细介绍在Vue项目中如何实现和使用防抖与节流。 ### 1. 防抖(debounce) 防抖技术的主要目的是避免频繁调用某个函数,例如在输入框输入时防止连续触发事件处理函数。当一个函数被频繁调用时,防抖会确保在...

    JavaScript函数节流和函数防抖之间的区别

    函数防抖的实现方式与函数节流类似,但其核心在于清除和重置定时器。在防抖的实现中,每次事件触发时会清除之前的定时器,设置一个新的定时器,只有在设定的时间间隔内没有新的事件触发时,定时器才会到期执行事件...

    JavaScript性能优化之函数节流(throttle)与函数去抖(debounce)

    JavaScript性能优化是提升网页应用用户体验的关键,其中函数节流(throttle)和函数去抖(debounce)是两种常见的优化策略,主要用于控制频繁调用的函数,以避免不必要的计算和资源消耗。 函数节流(throttle)的...

    js常用函数封装cookiedom操作自适应浏览器前缀函数节流等

    这里我们将深入探讨`cookie`操作、`DOM`操作、浏览器前缀处理以及函数节流技术这四个核心主题,这些都是JavaScript开发中不可或缺的部分。 首先,让我们来看看`cookie`操作。Cookie是一种在客户端存储数据的方法,...

Global site tag (gtag.js) - Google Analytics