前言 :前端
防抖函数和节流函数是优化高频率执行js代码的一种手段,js中的一些事件,好比浏览器中的resize,scroll,鼠标事件mouseover,mousemove,input输入框的keypress等事件在触发时,会不断的调用绑定在事件上的回调函数,极大的浪费资源,下降前端性能,为了优化体验,须要对这类事件进行调用的次数的限制,这里就须要咱们的函数节流和函数防抖.数组
防抖和节流异同点浏览器
相同:在不影响客户体验的前提下,将频繁的回调函数,进行次数缩减,避免大量计算致使的页面卡顿bash
不一样:防抖是将屡次执行变为是最后一次执行,节流是将屡次执行变为在规定时间内只执行一次app
防抖概念:指触发事件后在规定时间内回调函数只能执行一次,若是在规定时间内又触发了该事件,则会从新开始算规定时间。(每次执行事件都会清除前一次的事件)dom
打个简单的好比:前端性能
函数防抖就是法师发技能的时候要读条,技能读条没完再按技能就会刷新技能,从新进行读条。
复制代码
也就是说,这个事件还未执行完,可是你再一次触发了这个函数,这个就会事件抖动的效果,如何避免这个问题,就用到了防抖函数的思想,就是在每次事件开始前都须要清理一下以前的事件。函数
代码以下:工具
var debounce=function(fn, wait){
var timer = null;
return function(){
if(timer!== null) clearTimeout(timeout);
timer= setTimeout(fn, wait);
}
};
function yourfunc(){
console.log(Math.random())
};
window.addEventListener('scroll',debounce(yourfunc,1000));
复制代码
节流的概念:当持续触发事件时,在规定时间段内只能调用一次回调函数。若是在规定时间内又触发了该事件,则什么也不作,也不会重置定时器.性能
<script>
var throttle = function(func, delay) {
  var timer = null;
return function() {
var context = this;
var args = arguments;
if (!timer) {
timer = setTimeout(function() {
func.apply(context, args);
timer = null;
}, delay);
}
}
}
function yourfunc() {
  console.log(Math.random());
}
window.addEventListener('scroll', throttle(yourfunc, 1000));
</script>
复制代码
上面这个方法的执行理念就是,当函数开始执行能够设置一个标记变量,当函数彻底执行彻底,再把标记的变量设置为原来的变量,每次执行的时候都须要判断变量的值.
相同点:
均可以经过使用 setTimeout 实现。 目的都是,下降回调执行频率。节省计算资源。
不一样点:
1)函数防抖,在一段连续操做结束后,处理回调,利用clearTimeout 和 setTimeout实现。函数节流,在一段连续操做中,每一段时间只执行一次,频率较高的事件中使用来提升性能。
2)函数防抖关注必定时间连续触发的事件只在最后执行一次,而函数节流侧重于一段时间内只执行一次。
连续的事件,只需触发一次回调的场景有:
搜索框搜索输入。只需用户最后一次输入完,再发送请求 手机号、邮箱验证输入检测 窗口大小Resize。只需窗口调整完成后,计算窗口大小。防止重复渲染。
间隔一段时间执行一次回调的场景有:
滚动加载,加载更多或滚到底部监听
谷歌搜索框,搜索联想功能
高频点击提交,表单重复提交
Lodash是一个轻量级的JavaScript工具函数库,它方便了平常开发中对数据的操做,提升了开发效率。
平常开发中,一般会对数据,特别是数组和对象进行各类读写等操做:好比去重,拷贝,合并,过滤,求交集,求和等等。
而在lodash中也有对函数节流和函数防抖的介绍
_.throttle(func, [wait=0], [options={}])
func (Function): 要节流的函数。
[wait=0] (number): 须要节流的毫秒数。
[options={}] (Object): 选项对象。
[options.leading=true] (boolean): 指定调用在节流开始前,默认true。
[options.trailing=true] (boolean): 指定调用在节流结束后,默认true
_.debounce(func, [wait=0], [options={}])
func (Function): 要防抖动的函数。
[wait=0] (number): 须要延迟的毫秒数。
[options={}] (Object): 选项对象。
[options.leading=false] (boolean): 指定在延迟开始前调用,默认false。
[options.maxWait] (number): 设置 func 容许被延迟的最大值。
[options.trailing=true] (boolean): 指定在延迟结束后调用,默认true。
补充:用户在频繁操做事件的时候,除了能够用到函数的防抖和节流以外还能够用到其余的方法
复制代码
1)防止重复点击能够添加一个开关,让这个开关默认是true,第一次点击,将其变为false,点击事件的执行须要判断这个开关是否为true,为true执行,false不执行
2)还有一个方法就是点击后off(‘click’)解除绑定事件,而后设置定时器必定事件后从新on(‘click’,函数名)绑定事件。