Open Xpig4432xyx opened 6 years ago
lodash库有封装,可以看一下源码实现
建议可以用箭头函数来减少多余的变量定义
function debounce(fun, delay) {
return function (args) {
clearTimeout(fun.id)
fun.id = setTimeout(() => {
fun.call(this, args)
}, delay)
}
}
前言
据说阿里有一道面试题就是谈谈函数节流和函数防抖。 糟了,这可触碰到我的知识盲区了,好像听也没听过这2个东西,痛定思痛,赶紧学习学习。here we go!
概念和例子
函数防抖(debounce)
看一个🌰(栗子):
看一下运行结果:
可以看到,我们只要按下键盘,就会触发这次ajax请求。不仅从资源上来说是很浪费的行为,而且实际应用中,用户也是输出完整的字符后,才会请求。下面我们优化一下:
看一下运行结果:
可以看到,我们加入了防抖以后,当你在频繁的输入时,并不会发送请求,只有当你在指定间隔内没有输入时,才会执行函数。如果停止输入但是在指定间隔内又输入,会重新触发计时。 再看一个🌰:
看一下运行结果:
这个🌰就很好的解释了,如果在时间间隔内执行函数,会重新触发计时。biu会在第一次1.5s执行后,每隔1s执行一次,而boom一次也不会执行。因为它的时间间隔是2s,而执行时间是1s,所以每次都会重新触发计时
函数节流(throttle)
看一个🌰:
看一下运行结果:
可以看到,我们在不断输入时,ajax会按照我们设定的时间,每1s执行一次。
结合刚刚biubiubiu的🌰:
不管我们设定的执行时间间隔多小,总是1s内只执行一次。
总结
结合应用场景
拓展
这是高程中的经典代码:
我们通过上面的例子知道,其实这段函数应该是debounce函数防抖,而不是函数节流,很多文章也都会拿这段代码来做例子,函数本身没错,但是命名错了。
原作者的这段话就写的很好,
我们要做王五,并且争取早日产出一手知识!加油!
广而告之
本文发布于薄荷前端周刊,欢迎Watch & Star ★,转载请注明出处。
欢迎讨论,点个赞再走吧 。◕‿◕。 ~