JS debounce和throttle 去抖和节流

JS中的高频事件有scroll recize mouseover。 如果频繁触发事件绑定函数,会导致浏览器性能上的损失。

因此我们通常会添加延迟执行的逻辑。

在underscore.js里面有debounce和throttle这两个方法。

throttle创建并返回一个节流阀一样的函数,当重复调用函数的时候,至少每隔wait毫秒调用一次该函数

var throttled = _.throttle(updatePosition, 100);
$(window).scroll(throttled);

  

debounce函数,去抖,是讲延迟函数的执行在函数最后一次调用的wait毫秒之后,比如当窗口停止改变大小之后重新计算布局。

可以这样理解,像弹簧一样,只有你松开压住弹簧的手,弹簧才会向上弹起。

也就是说当调用动作n毫秒后,才会执行该动作,若在这n毫秒内又调用此动作则将重新计算执行时间。

1 var lazyLayout = _.debounce(calculateLayout, 300);
2 $(window).resize(lazyLayout);

//简单实现一个deboncevar debonce = function(fn,idle){
  var last = null;
  return function() {
    var ctx = this, args = arguments;
    clearTimeout(last);
    last = setTimeout(function(){
      fn.apply(ctx,args);
    },idle)
  }
}

  

时间: 2024-12-15 21:35:51

JS debounce和throttle 去抖和节流的相关文章

angular.js和vue.js中实现函数去抖(debounce)

问题描述 搜索输入框中,只当用户停止输入后,才进行后续的操作,比如发起Http请求等. 学过电子电路的同学应该知道按键防抖.原理是一样的:就是说当调用动作n毫秒后,才会执行该动作,若在这n毫秒内又调用此动作则将重新计算执行时间.本文将分别探讨在angular.js和vue.js中如何实现对用户输入的防抖. angular.js中解决方案 把去抖函数写成一个service,方便多处调用: .factory('debounce', ['$timeout','$q', function($timeou

vue项目中的去抖与节流

// 防抖 export function _debounce(fn, delay) { var delay = delay || 200; var timer; return function () { var th = this; var args = arguments; if (timer) { clearTimeout(timer); } timer = setTimeout(function () { timer = null; fn.apply(th, args); }, dela

理解JavaScript中的去抖函数

何为去抖函数?在学习JavaScript去抖函数之前我们需要先弄明白这个概念.很多人都会把去抖跟节流两个概念弄混,但是这两个概念其实是很好理解的. 去抖函数(Debounce Function),是一个可以限制指定函数触发频率的函数.我们可以理解为连续调用同一个函数多次,只得到执行该函数一次的结果;但是隔一段时间再次调用时,又可以重新获得新的结果,具体这段时间有多长取决于我们的设置.这种函数的应用场景有哪些呢? 比如我们写一个DOM事件监听函数, window.onscroll = functi

JS魔法堂:函数节流(throttle)与函数去抖(debounce)

一.前言 以下场景往往由于事件频繁被触发,因而频繁执行DOM操作.资源加载等重行为,导致UI停顿甚至浏览器崩溃. 1. window对象的resize.scroll事件 2. 拖拽时的mousemove事件 3. 射击游戏中的mousedown.keydown事件 4. 文字输入.自动完成的keyup事件 实际上对于window的resize事件,实际需求大多为停止改变大小n毫秒后执行后续处理:而其他事件大多的需求是以一定的频率执行后续处理.针对这两种需求就出现了debounce和throttl

函数节流和函数去抖

函数节流和函数防抖,两者都是优化高频率执行js代码的一种手段. 以下场景往往由于事件频繁被触发,因而频繁执行DOM操作.资源加载等重行为,导致UI停顿甚至浏览器崩溃. 1. window对象的resize.scroll事件 2. 拖拽时的mousemove事件 3. 射击游戏中的mousedown.keydown事件 4. 文字输入.自动完成的keyup事件 实际上对于window的resize事件,实际需求大多为停止改变大小n毫秒后执行后续处理:而其他事件大多的需求是以一定的频率执行后续处理.

javascript中的函数节流和函数去抖

带着问题去尝试 首先我们要知道为什么要用到函数节流和函数去抖?我们带着以下的疑问来进行分析! 1.比如搜索框,你会用到什么事件(change.blur.keyup等)?去做什么效果?2.再比如scroll滚动事件,怎么去触发?是滚一段距离触发一次?还是滚一圈触发一次?还是滚一次触发一次?3.还包括mouseover事件是怎么触发呢?...... 场景实例 函数节流和去抖的出现场景,一般都伴随着客户端 DOM 的事件监听.举个例子,实现一个原生的拖拽功能(不能用 H5 Drag&Drop API)

JavaScript函数节流与函数去抖

介绍 首先解释一下这两个概念: 函数节流(throttle):是让一个函数无法在很短的时间间隔内连续调用,当上一次函数执行后过了规定的时间间隔,才能进行下一次该函数的调用. 函数去抖(debounce):让一个函数在一定间隔内没有被调用时,才开始执行被调用方法. 两个方法都是用来提升前端性能,减轻浏览器压力. 应用 理解起来有点费力,通过应用来理解就轻松了.通常,我们会在有用户交互参与的地方添加事件,而往往这种事件会被频繁触发. 想象一下窗口的resize事件或者是一个元素的onmousemov

函数节流与函数去抖

函数节流与函数去抖都是为了解决密集的js函数运行问题.怎么分析和使用两种情况呢? 函数节流: 是指函数在一段时间执行一次,即降低函数运行的频率.比如说,在onmousemove时,进行一次dom操作,如果长时间的onmousemove,这样所触发回调数量是大量的,因为进行了大量的dom操作,可能导致浏览器无响应.这时候就可以听过函数节流,使一段时间触发一次回调函数,大大降低了消耗. var ifRun = true; function run () { if (!ifRun) { return;

浅谈 Underscore.js 中 _.throttle 和 _.debounce 的差异

Underscore.js是一个很精干的库,压缩后只有5.2KB.它提供了几十种函数式编程的方法,弥补了标准库的不足,大大方便了JavaScript的编程. 本文仅探讨Underscore.js的两个函数方法 _.throttle 和 _.debounce 的原理.效果和用途. 通常的函数(或方法)调用过程分为三个部分:请求.执行和响应.(文中“请求”与“调用”同义,“响应”与“返回”同义,为了更好的表述,刻意采用请求和响应的说法.) 某些场景下,比如响应鼠标移动或者窗口大小调整的事件,触发频率