深入理解JS函数节流和去抖动】的更多相关文章

一.什么是节流和去抖? 1.节流 节流就是拧紧水龙头让水少流一点,但是不是不让水流了.想象一下在现实生活中有时候我们需要接一桶水,接水的同时不想一直站在那等着,可能要离开一会去干一点别的事请,让水差不多流满一桶水的时候再回来,这个时候,不能把水龙头开的太大,不然还没回来水就已经满了,浪费了好多水,这时候就需要节流,让自己回来的时候水差不多满了. 那在JS里有没有这种情况呢,典型的场景是图片懒加载监听页面的scoll事件,或者监听鼠标的mousemove事件,这些事件对应的处理方法相当于水,由于s…
1.什么是节流和去抖? 节流.就是拧紧水龙头让水少流一点,但是不是不让水流了.想象一下在现实生活中有时候我们需要接一桶水,接水的同时不想一直站在那等着,可能要离开一会去干一点别的事请,让水差不多流满一桶水的时候再回来,这个时候,不能把水龙头开的太大,不然还没回来水就已经满了,浪费了好多水,这时候就需要节流,让自己回来的时候水差不多满了.那在JS里有没有这种情况呢,典型的场景是图片懒加载监听页面的scoll事件,或者监听鼠标的mousemove事件,这些事件对应的处理方法相当于水,由于scroll…
1.什么是js函数节流 其本质就是不让某些代码(函数)在没有间断的情况下连续重复执行,目的就是让执行函数的请求停止了一段时间后才执行. 2.函数节流运用的场景 窗口大小的改变(resize事件),滚动事件(scroll事件),鼠标移动事件(mousemove事件),touchmove事件(做过手机端的同学一定知道,手机中手指滑动其实触发了多次touchmove),我们在绑定这些事件的时候,函数会被多次执行,因为性能的需要,此时函数节流就派上用场! 3.函数节流的书写基本形式 网上也提供很多关于函…
js 函数节流和防抖 throttle 节流 事件触发到结束后只执行一次. 应用场景 触发mousemove事件的时候, 如鼠标移动. 触发keyup事件的情况, 如搜索. 触发scroll事件的时候, 譬如鼠标向下滚动停止时触发加载数据. coding 方法1 防抖 // function resizehandler(fn, delay){ // clearTimeout(fn.timer); // fn.timer = setTimeout(() => { // fn(); // }, de…
1.函数节流throttle 通俗解释: 假设你正在乘电梯上楼,当电梯门关闭之前发现有人也要乘电梯,礼貌起见,你会按下开门开关,然后等他进电梯: 但是,你是个没耐心的人,你最多只会等待电梯停留一分钟: 在这一分钟内,你会开门让别人进来,但是过了一分钟之后,你就会关门,让电梯上楼. 所以throttle的作用是,预先设定一个执行周期,当调用动作的时刻大于等于执行周期则执行该动作,然后进入下一个新的时间周期. 应用:在指定时间,事件最多触发一次. 2.函数去抖debounce 假设你正在乘电梯上楼,…
一:函数防抖1.理解:触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间2.思路:每次触发事件时都取消之前的延时调用方法 3.实现: function debounce(fn) { let timeout = null; // 创建一个标记用来存放定时器的返回值 return function () { clearTimeout(timeout); // 每当用户输入的时候把前一个 setTimeout clear 掉 timeout = setTimeout((…
现代网页的实现上,会有很多交互上的优化,比如常见的 滚动加载 ,输入联想 等等.他们的实现思路很简单,以滚动加载而言,无非就是去是增加一个滚动的事件监听,每次滚动判断当前的元素是否已经滚动到了用户的可视区,然后根据判断结果来决定是否来加载相关数据. 输入联想也类似,无非就是修改一下监听的事件类型,和判断的相关逻辑. 前端交互的优化上,我们总是需要需要事件监听来知道用户进行了什么操作,从而设定页面给出怎样的反应.但本文主要的内容不是讲如何具体的实现某个交互,而是对交互实现的依赖的事件监听那部分的优…
函数在执行时,会在函数体内部自动生成一个this指针.谁直接调用产生这个this指针的函数,this就指向谁. 怎么理解指向呢,我认为指向就是等于.例如直接在js中输入下面的等式: console.log(this===window);//true 情况不同,this指向的对象也不同.例如: 1.  函数声明的情况 var bj=10; function add(){ var bj=20; console.log(this);//window console.log( console.log(b…
在很多笔试面试题中总能看到js函数去抖和函数节流,看过很多关于这两者的讨论,最近终于在一个需求中使用了函数去抖(debounce)和函数节流(throttle). 需要完成的效果是,鼠标在表格的单元格上时,显示一个浮动框,并且浮动框会随鼠标移动. 这是效果图,没有做成动图,应该都能想象出来: 基本效果很容易实现,用单元格的hover事件控制浮动框的显示:鼠标移出单元格,即mouseout事件触发浮动框的隐藏: 而浮动框跟随鼠标移动的效果则用mousemove事件,监听鼠标的位置,同时改变浮动框的…
看JS高级程序设计时,了解到一个概念--函数节流,是为了防止在高频率触发某些事件导致浏览器崩溃.最近又了解到另一个概念,防抖,感觉和函数节流很像,也查看了很多篇博文,算是理解了. 区别: 函数节流:频繁调用某方法,在一定的时间间隔内至少会触发一次 防抖:在一定时间间隔内频繁调用某方法,只响应最后一次操作. 函数节流应用场景 无限滚动 用户向下滚动无限滚动页面,需要检查滚动位置距底部多远,如果邻近底部了,我们可以发 AJAX 请求获取更多的数据插入到页面中. 此时_.debounce 不太适用,因…
前言 据说阿里有一道面试题就是谈谈函数节流和函数防抖.糟了,这可触碰到我的知识盲区了,好像听也没听过这2个东西,痛定思痛,赶紧学习学习.here we go! 概念和例子 函数防抖(debounce) 在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时. 看一个(栗子): //模拟一段ajax请求 function ajax(content) { console.log('ajax request ' + content) } let inputa = document.getEl…
背景:在前端开发中,有时会为页面绑定resize事件,或为一个页面元素拖拽事件(其核心就是绑定mousemove)在一个正常操作中也有可能在一个短时间内触发非常多次事件绑定程序,而DOM操作是很消耗性能的,如果为这些事件绑定一些操作DOM节点的操作的话就会引发大量的计算,在用户看来页面可能就一时间没有响应,这个页面就变卡变慢了,甚至在IE下,如果绑定的resize事件进行较多DOM操作,其高频率可能直接就使得浏览器崩溃.函数节流简单讲就是让一个函数无法在很短的时间间隔内连续调用,只有当上一次函数…
函数节流在日常的DOM界面数据交互中有比较大的作用,可以减少服务器的请求,同时减少客户端的内存影响 Underscore.js  本省就包含了函数节流的处理函数 _.throttle 和 _.debounce 简单的测试使用如下: 需要使用的类库为jquery  .Underscore 测试的方法为:mousemove 事件 测试页面代码如下: <!DOCTYPE html > <html> <head> <script src="jquery-1.11…
最近一个面试官问了我一个函数节流的问题,然后感觉自己工作中遇到过这个问题,但是不知道这种形式就是函数节流.下面我来说下这个Js的高级问题,思路:函数节流就是防止用户高频调用某个事件而做的Js层面的处理方法.主要就是在一定时间内让用户的操作只执行一次指定方法. 代码实现(html): <!doctype html> <html> <head> </head> <body> <button id="clickme" valu…
概念解释 函数节流: 频繁触发,但只在特定的时间内才执行一次代码 函数防抖: 频繁触发,但只在特定的时间内没有触发执行条件才执行一次代码 函数节流 函数节流应用的实际场景,多数在监听页面元素滚动事件的时候会用到.因为滚动事件,是一个高频触发的事件. 以下是监听页面元素滚动的示例代码: // 函数节流 var canRun = true; document.getElementById("throttle").onscroll = function(){ if(!canRun){ //…
函数被频繁调用场景 Js中的函数大多数情况下都是由用户主动调用触发的,一般不会遇到性能相关的问题.但在一些少数情况下,函数的触发不是由用户直接控制.在这些场景下,函数有可能被非常频繁地调用,而造成大的性能问题. 比如以下场景: window.onresize事件.如果我们给window对象绑定了resize事件,当浏览器窗口大小被改变的时候,这个事件的触发的频率非常高.(其实任何元素节点也是可以绑定resize事件的,如何实现可参考 如何给div绑定resize事件.也可以使用第三方库 resi…
js函数预解析 例子1: 先上一段代码,看看能不能写出最终的执行结果. console.log(a); var a = 1; console.log(a); function a(){ console.log(2); } var a = 3; console.log(a); function a(){ console.log(4); } console.log(a); a(); 运行结果: 解释一下: 首先预解析阶段遇到 var a = 1:声明变量a 然后遇到第一个函数a声明,这时由于和变量a…
前言 事件的触发权很多时候属于用户,可能会出现下列问题: 向后台发送数据,用户频繁触发,对服务器造成压力: 一些浏览器事件,如window.onresize,window.mousemove等,触发的频率会非常高,会造成浏览器性能问题. 如果碰到这些问题,那就需要用到函数节流与防抖了. 一.函数节流(throttle) 函数节流:一个函数执行一次后,只有大于设定的执行周期后才会执行第二次. 有个需要频繁触发函数,处于优化性能角度,在规定时间内,只让函数触发的第一次生效,后面不生效. 1.如何实现…
问题1:如果实现了dom拖拽功能,但是在绑定拖拽事件的时候发现每当元素稍微移动一点便触发了大量的回调函数,导致浏览器直接卡死,这个时候怎么办? 问题2:如果给一个按钮绑定了表单提交的post事件,但是用户有些时候在网络情况极差的情况下多次点击按钮造成表单重复提交,如何防止多次提交的发生? 为了应对如上场景,便出现了 函数防抖 和 函数节流 两个概念,总的来说:这两个方法是在时间轴上控制函数的执行次数. 1.函数防抖(debounce) 概念: 在事件被触发n秒后再执行回调,如果在这n秒内又被触发…
这次说一下对象具体的一个实例:函数,以及其对应的作用域与作用域链.简单的东西大家查下API就行了,这里我更多的是分享自己的理解与技巧.对于作用域和作用域链,相信绝大多数朋友看了我的分享都能基本理解,少数人看完之后再努力思考思考,基本也就懂了.最后说一下,不合理的地方,欢迎批评指正. 函数调用 跳过基本的函数定义,直接说函数调用,js中的函数调用有以下四种方式: 1.直接调用 2.作为对象的方法调用 当作为对象调用时,这里的this指向调用方法的对象,而我们所说的链式调用即是在函数内部作用域的最后…
function fun(n,o) { console.log(o) return { fun:function(m){ return fun(m,n); } }; } ); a.fun(); a.fun(); a.fun();//undefined,?,?,? ).fun().fun().fun();//undefined,?,?,? ).fun(); c.fun(); c.fun();//undefined,?,?,? //问:三行a,b,c的输出分别是什么? 这是一道非常典型的JS闭包问题…
说完防抖,下面我们讲讲节流,规矩就不说了,先上代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no&…
函数也是对象,但是函数却不像数组--数组是对象的一种,它是对象的一个子集.函数和数组之间不是单纯的包含与被包含的关系,它们之间有点像鸡生蛋蛋生鸡的逻辑. 来例子:function Fn(){ this.name='小明': this.age=10; } var fn1=new Fn(); 这说明对象可以通过函数来创建,但是如果说对象都是通过函数来创建的肯定又会觉得不对,因为var obj={a:10,b:20},var arr=[5,'x',true].然而这仅仅是一种"快捷方式",在…
函数防抖(debounce):在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时. 看一个…
原文链接:http://www.alloyteam.com/2012/11/javascript-throttle/…
场景 在使用小程序的时候会出现这样一种情况:当网络条件差或卡顿的情况下,使用者会认为点击无效而进行多次点击,最后出现多次跳转页面的情况,就像下图(快速点击了两次): 解决办法 然后从 轻松理解JS函数节流和函数防抖 中找到了解决办法,就是函数节流(throttle):函数在一段时间内多次触发只会执行第一次,在这段时间结束前,不管触发多少次也不会执行函数. /utils/util.js: function throttle(fn, gapTime) { if (gapTime == null ||…
好吧,一直在秋招中,都没怎么写博客了...今天赶紧来补一补才行...我发现,在面试中,讲到函数节流好像可以加分,尽管这并不是特别高深的技术,下面就聊聊吧! ^_^ 备注:以下内容部分来自<JavaScript高级程序设计> 函数节流的目的 从字面上就可以理解,函数节流就是用来节流函数从而一定程度上优化性能的.例如,DOM 操作比起非DOM 交互需要更多的内存和CPU 时间.连续尝试进行过多的DOM 相关操作可能会导致浏览器挂起,有时候甚至会崩溃.尤其在IE 中使用onresize 事件处理程序…
函数节流的目的 从字面上就可以理解,函数节流就是用来节流函数从而一定程度上优化性能的.例如,DOM 操作比起非DOM 交互需要更多的内存和CPU 时间.连续尝试进行过多的DOM 相关操作可能会导致浏览器挂起,有时候甚至会崩溃.尤其在IE 中使用onresize 事件处理程序的时候容易发生,当调整浏览器大小的时候,该事件会连续触发.在onresize 事件处理程序内部如果尝试进行DOM 操作,其高频率的更改可能会让浏览器崩溃.又例如,我们常见的一个搜索的功能,我们一般是绑定keyup事件,每按下一…
前言:         本人纯小白一个,有很多地方理解的没有各位大牛那么透彻,如有错误,请各位大牛指出斧正!小弟感激不尽.         函数防抖与节流是做什么的?下面进行通俗的讲解. 本文借鉴:https://www.cnblogs.com/cc-freiheit/p/10827372.html 大致原理:         函数防抖:   函数防抖做一件事,这件事并不是立即去做,而是等到一段时间之后再去做.如果这段时间内有一个东西再次触发了,那么就再等一次时间.         函数节流: …
带着问题去尝试 首先我们要知道为什么要用到函数节流和函数去抖?我们带着以下的疑问来进行分析! 1.比如搜索框,你会用到什么事件(change.blur.keyup等)?去做什么效果?2.再比如scroll滚动事件,怎么去触发?是滚一段距离触发一次?还是滚一圈触发一次?还是滚一次触发一次?3.还包括mouseover事件是怎么触发呢?...... 场景实例 函数节流和去抖的出现场景,一般都伴随着客户端 DOM 的事件监听.举个例子,实现一个原生的拖拽功能(不能用 H5 Drag&Drop API)…