js防抖就是触发高频事件后n秒内函数只会执行1次吗?

函数函数我们先来看一看防抖和节流比较精炼的定义:

防抖: 指触发事件后在 n 秒内函数只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间。

节流:连续发生的事件在n秒内只执行一次

相信,看完上面说的定义后,有些人还是不能很好的明白他们之间的区别,那么就接下来谈一谈我对它们的理解吧。

防抖防抖,顾名思义,就是防止手抖么,你想一下你手抖会干什么(???停止开车)比如一个按钮,点一下向服务器发送一个请求,你手一抖,点了好几下,一下就向服务器发了好几次请求,这不浪费时间资源么。这时候,就要有个防抖函数来帮帮你了。

当你点击这个按钮后,不管你手怎么抖,一直抖个不停的点这个按钮,都只向服务器发送一次请求,只有过了一段时间后,确定了你手不再抖后(在这一段时间你都没有再点这个按钮),你再去点击这个按钮,才会再次向服务器发送请求。

下面分析一下代码,你一定会更加的明白:


 
 
 
 

首先会执行第18行的debounce函数,返回一个匿名函数作为按钮点点击的回调。当点击一次按钮的时候,timeout为undefined,会执行第10行的代码,设置一个定时器。当你手抖(在wait时间内有点击了按钮)的时候,会执行第9行,将上一个定时器清除,然后再设置一个新的定时器。只有你手不抖了(在wait时间内没有点击按钮),就会执行第11行,执行点击按钮所要发送的请求服务。

可以看出来,这个防抖函数,是再确定你手不抖前的最后一次点击才发送的请求数据。但有时候你并不想这样啊,你觉得,当我第一次点击的时候就要发送数据,至于后面我手抖,你控制不让我发不久好了,这样我手抖的时候,发现数据已经请求过来了,我一高兴,手不就不抖了,好的,满足你的要求。


 
 
 
 
 
 

相当于,在第一次点击,还没有设置定时器的时候,就先执行请求数据的函数,然后设置定时器用来防抖,后面不管怎么抖,timeout值都存在,只有再不抖后,才会将timeout设置为null,然后再点击的时候就又能请求数据了。

节流节流,顾名思义就是节省流量了,你想想,怎么才能节省流量。那不就减少请求呗。1秒请求3次,我改成3秒请求1次,那流量还不妥妥的节省下来了。就比如,你一个搜索框,按一下键盘向服务器发送一次请求,卡卡的,页面一直跟着你敲键盘在变化,你给老板说,看帅不,实时动态搜索,这时候老板上来就给你两耳刮子,说着,我可算知道为啥一个小项目就要买这么好的服务器了,都是你这玩意霍霍的。这时候,节流就能帮助到你了,设置个时间,这个时间内,不管怎么敲键盘,只请求一次数据,差不多输一个单词请求一次,大大节省了后台的压力,你的动态搜索也能够很好的实现。

估计这个还是比较好理解的,直接看代码就好了。


 
 
 
 

这个代码也比较好理解,每次按键抬起的时候,都会判断当前的时间和上一次执行搜索功能的时间的差值,判断要不要再进行一次搜索。

好了,函数的防抖与节流的区别和实现应该很清楚了。

最后不得不感慨,中华文化的博大精深以及前辈们翻译时的智慧,debounce与throttle对应防抖与节流,让这两个很容易搞混的概念一下子就变得如此清晰。

按照设定的时间固定执行一次函数,比如200ms一次。注意:固定就是你在mousemove过程中,执行这个节流函数,它一定是200ms(你设定的定时器延迟时间)内执行一次。没到200ms,一定会返回,没有执行回调函数的。

抖动停止后的时间超过设定的时间时执行一次函数。注意:这里的抖动停止表示你停止了触发这个函数,从这个时间点开始计算,当间隔时间等于你设定时间,才会执行里面的回调函数。如果你一直在触发这个函数并且两次触发间隔小于设定时间,则一定不会到回调函数那一步。·

主要应用场景有:input验证、搜索联想、resize

思路: 第一次先设定一个变量true,第二次执行这个函数时,会判断变量是否true,是则返回。当第一次的定时器执行完函数最后会设定变量为flase。那么下次判断变量时则为flase,函数会依次运行。

思路:首次运行时把定时器赋值给一个变量,第二次执行时,如果间隔没超过定时器设定的时间则会清除掉定时器,重新设定定时器,依次反复,当我们停止下来时,没有执行清除定时器,超过一定时间后触发回调函数。

博文有介绍更详细的原理和代码demo:,希望可以帮到您


· 知道合伙人软件行家

从事多年系统运维,喜欢编写各种小程序和脚本。


函数节流和函数防抖,两者都是优化高频率执行js代码的一种手段。
大家大概都知道旧款电视机的工作原理,就是一行行得扫描出色彩到屏幕上,然后组成一张张图片。由于肉眼只能分辨出一定频率的变化,当高频率的扫描,人类是感觉不出来的。反而形成一种视觉效果,就是一张图。就像高速旋转的风扇,你看不到扇叶,只看到了一个圆一样。
同理,可以类推到js代码。在一定时间内,代码执行的次数不一定要非常多。达到一定频率就足够了。因为跑得越多,带来的效果也是一样。倒不如,把js代码的执行次数控制在合理的范围。既能节省浏览器CPU资源,又能让页面浏览更加顺畅,不会因为js的执行而发生卡顿。这就是函数节流和函数防抖要做的事。
函数节流是指一定时间内js方法只跑一次。比如人的眨眼睛,就是一定时间内眨一次。这是函数节流最形象的解释。
函数防抖是指频繁触发的情况下,只有足够的空闲时间,才执行代码一次。比如生活中的坐公交,就是一定时间内,如果有人陆续刷卡上车,司机就不会开车。只有别人没刷卡了,司机才开车。
函数节流应用的实际场景,多数在监听页面元素滚动事件的时候会用到。因为滚动事件,是一个高频触发的事件。以下是监听页面元素滚动的示例代码:
// 判断是否已空闲,如果在执行中,则直接return
函数节流的要点是,声明一个变量当标志位,记录当前代码是否在执行。
如果空闲,则可以正常触发方法执行。
如果代码正在执行,则取消这次方法执行,直接return。
这个方法的作用是监听ID为throttle元素的滚动事件。
当canRun为true,则代表现在的滚动处理事件是空闲的,可以使用。
通过关卡if(!canRun),等于就拿到了通行证。然后下一步的操作就是立马将关卡关上canRun=false。这样,其他请求执行滚动事件的方法,就被挡回去了。
接着用setTimeout规定最小的时间间隔300,接着再执行setTimeout方法体里面的内容。
最后,等setTimeout里面的方法都执行完毕,才释放关卡canRun=true,允许下一个访问者进来。
这个函数节流的实现形式,需要注意的是执行的间隔时间是>=300ms。如果具体执行的方法是包含callback的,也可以将canRun=true这一步放到callback中。理解了函数节流的关卡设置重点,其实改起来就简单多了。
函数防抖的应用场景,最常见的就是用户注册时候的手机号码验证和邮箱验证了。只有等用户输入完毕后,前端才需要检查格式是否正确,如果不正确,再弹出提示语。以下还是以页面元素滚动监听的例子,来进行解析:
函数节流的要点,也是需要一个setTimeout来辅助实现。延迟执行需要跑的代码。
如果方法多次触发,则把上次记录的延迟执行代码用clearTimeout清掉,重新开始。
如果计时完毕,没有方法进来访问触发,则执行代码。
这个方法的作用是监听ID为debounce元素的滚动事件
进入滚动事件方法体的时候,做的第一件事就是清除上次未执行的setTimeout。而setTimeout的引用id由变量timer记录。
如果倒计时300ms以后,还没有新的方法触发滚动事件,则执行setTimeout中的代码。
函数防抖的实现重点,就是巧用setTimeout做缓存池,而且可以轻易地清除待执行的代码。
其实,用队列的方式也可以做到这种效果。这里就不深入了。
这是我写的一个测试demo,把鼠标移动到模块上方,滚动滚轮,即可在控制台查看输出效果。

下载百度知道APP,抢鲜体验

使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。

前言:针对一些会频繁触发的事件如scroll、resize,如果正常绑定事件处理函数的话,有可能在很短的时间内多次连续触发事件,十分影响性能

节流:使得一定时间内只触发一次函数。
它和防抖动最大的区别就是,节流函数不管事件触发有多频繁,都会保证在规定时间内一定会执行一次真正的事件处理函数,而防抖动只是在最后一次事件后才触发一次函数。
原理是通过判断是否到达一定时间来触发函数,若没到规定时间则使用计时器延后,而下一次事件则会重新设定计时器

时间戳实现:当高频事件触发时,第一次应该会立即执行(给事件绑定函数与真正触发事件的间隔如果大于delay的话),而后再怎么频繁触发事件,也都是会每delay秒才执行一次。而当最后一次事件触发完毕后,事件也不会再被执行了。

  • 前端性能优化总结 资源优化 缓存 最好的资源优化就是不加载资源.缓存也是最见效的优化手段.说实话,虽然说客户端缓存发生在浏览器端,但缓存主要还是服务端来控制,与我们前端关系并不是很大.但还是有必要了解 ...

  • 本文是Web前端性能优化系列文章中的第七篇,主要讲述内容:精简Javascript代码,以及移出重复脚本.完整教程可查看:  一.精简javascript 基础知识 精简:从javascript代码中 ...

  • 对前端开发工程师来说,前端性能优化的重要性是不言而喻的,最为大家所知的是YSLOW的23条优化规则,在我的理解中,性能优化不纯粹是指用户访问网站的速度,也包括开发的效率,这里我总结下我理解中的WEB前 ...

  • 摘要:本文将分享一些前端性能优化的常用手段,包括减少请求次数.减小资源大小.各种缓存.预处理和长连接机制,以及代码方面的性能优化等方面. base64:尤其是在移动端,小图标可以base64(webp ...

我要回帖

更多关于 js关闭页面触发的事件 的文章

 

随机推荐