You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
import debounce from './debounce.js'
import isObject from './isObject.js
function throttle(func, wait, options) {
let leading = true
let trailing = true
if (typeof func !== 'function') {
throw new TypeError('Expected a function')
}
if (isObject(options)) {
leading = 'leading' in options ? !!options.leading : leading
trailing = 'trailing' in options ? !!options.trailing : trailing
}
return debounce(func, wait, {
leading,
trailing,
'maxWait': wait
})
}
export default throttle
前言
前面已经对防抖和节流有了介绍,这篇主要看lodash是如何将防抖和节流合并成一个函数的。
初衷是深入lodash,学习它内部的好代码并应用,同时也加深节流防抖的理解。这里会先从防抖开始一步步往后,由简入繁,直到最后实现整个函数。
这里纯粹自己的理解,以及看了很多篇优质文章,希望能加深对节流防抖的理解,如果有不同意见或者看法,欢迎大家评论。
原理
前面虽然已经介绍过防抖和节流原理,这里为了加深印象,再搬过来。
通俗点说:定义wait=3000,持续点击按钮,前后点击间隔都在3秒内,则在最后一次点击按钮后,等待3秒再执行func方法。如果点击完按钮,3秒后未再次点击按钮,则3秒后直接执行func方法。
通俗点说,3 秒内多次调用函数,但是在 3 秒间隔内只执行一次,第一次执行后 3 秒 无视后面所有的函数调用请求,也不会延长时间间隔。3 秒间隔结束后则开始执行新的函数调用请求,然后在这新的 3 秒内依旧无视后面所有的函数调用请求,以此类推。
简单来说:每隔单位时间( 3 秒),只执行一次。
代码分析
一、引入代码部分
首先看源码最前方的引入。
isObject方法,直接拿出来,
root的引入主要是window。为了引出
window.requestAnimationFrame
。二、requestAnimationFrame代码
window.requestAnimationFrame()
告诉浏览器希望执行动画并请求浏览器在下一次重绘之前调用指定的函数来更新动画,差不多 16ms 执行一次。lodash这里使用
requestAnimationFrame
,主要是用户使用debounce函数未设置wait的情况下使用requestAnimationFrame
。由代码
const useRAF = (!wait && wait !== 0 && typeof window.requestAnimationFrame === 'function')
不难看出,函数未传入wait并且window.cancelAnimationFrame函数存在这两种情况下操作window.requestAnimationFrame
三、由简入繁输出防抖函数
首先,我们来看下lodash debounce API
这部分参数内容就直接摘抄在下方:
然后,我们一般防抖函数,需要的参数是:
func
、wait
、immediate
这三个参数,对应lodash,我们需要拿出这四个部分:接着,按照这个形式,先写出最简防抖方法。也就是这两部分参数的代码
其实可以在代码中加上判断同时为
false
时,默认wait=0
,直接执行window.requestAnimationFrame
部分,而不是定时器。首先,我们可以先来看lodash throttle部分源码:
其实就是将wait传入了debounce函数的
option.maxWait
中。所以最后,我们只需要将之前的代码加上maxWait参数部分。下面我们分析下maxWait新增的那部分代码。
分析maxWait新增部分
1.新增变量就不多说了。
2.从options中取出
maxWait
:maxing
,判断是否传了maxWait
参数。maxWait
还是为初始定义的undefined
。maxWait
,则重新赋值Math.max(+options.maxWait || 0, wait)
。这里主要就是取maxWait
和wait
中的大值。3.计算仍需等待的时间
首先判断是否节流(maxing):
这里是不是就是节流中
4.判断是否立即执行
lodash代码:
就往下执行。
这里是不是就是节流中
就往下执行。
5.有maxing时,应该如何处理函数
lodash代码:如果是节流函数就执行
节流函数中:
总之,lodash
maxWait
部分,尽管参数名多,但实际上就是节流函数中,判断剩余时间remaining
。不需要等待,就直接立即执行,否则就到剩余时间就执行一次,依次类推。对外 3 个方法
演示地址
可以去Github仓库查看演示代码
跟着大佬学系列
主要是日常对每个进阶知识点的摸透,跟着大佬一起去深入了解JavaScript的语言艺术。
后续会一直更新,希望各位看官不要吝啬手中的赞。
❤️ 感谢各位的支持!!!
❤️ 如果有错误或者不严谨的地方,请务必给予指正,十分感谢!!!
❤️ 喜欢或者有所启发,欢迎 star!!!
参考
The text was updated successfully, but these errors were encountered: