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
// Returns a function, that, as long as it continues to be invoked, will not// be triggered. The function will be called after it stops being called for// N milliseconds. If `immediate` is passed, trigger the function on the// leading edge, instead of the trailing._.debounce=function(func,wait,immediate){vartimeout,args,context,timestamp,result;varlater=function(){varlast=_.now()-timestamp;if(last<wait&&last>=0){timeout=setTimeout(later,wait-last);}else{timeout=null;if(!immediate){result=func.apply(context,args);if(!timeout)context=args=null;}}};returnfunction(){context=this;args=arguments;timestamp=_.now();varcallNow=immediate&&!timeout;if(!timeout)timeout=setTimeout(later,wait);if(callNow){result=func.apply(context,args);context=args=null;}returnresult;};};
https://wolfdu.fun/post?postId=5a3de8af25322c62a62e7b12
什么是debounce?
结合开篇给出的场景,我们不希望每次输入都执行保存操作,而是希望在我持续输出后进行思考的时候进行保存的操作。既然做不到在我思考的时候保存( ∙̆ .̯ ∙̆ ),那就在我输入停顿一定时间后执行保存操作吧。
来看一个简单的栗子:
我们在input中输入内容,然后在控制台中打印我们输入的内容。
项目中的解决办法是使用underscore提供的debounce方法解决的,我们这里也使用underscore来解决这个问题看看效果(这里就只写js代码了):
这里我们可以对比一下效果,没使用debounce时我们每次输入都会在控制台打印输入结果,使用了debounce后会在我们输入结束1000ms后才在控制台打印最终的输入结果 o‿≖✧
现象到本质
以上看来,知道了debounce的作用,那么它到底是如何实现这个功能的呢?
这里我们先参考着underscore的功能实现,模拟出自己的debounce方法。
从前面的简单解释可以知晓,我们会为目标函数设置一个定时器,当定时器未执行时,事件再次被触发,则清除当前的定时器,然后设置新的定时器,直到定时器timeout执行目标函数。
“debounce”模拟第一版
debounceOne
我们使用
debounceOne
替换underscore来跑一下示例,我们可以发现在我们输入的时候并不会在控制台打印输出,而是在停止输入后1000ms后打印的但是结果是这个样子的input: undefined
输出的并不是我们输入的结果,接下来我们搞定传参的问题。“debounce”模拟第二版
debounceTwo
这里我们可以使用
apply
来指定函数执行的上下文和参数,对apply有疑问的可以参见JavaScript模拟实现call,apply,bind等方法到目前为止我们的debounceTwo基本以及能满足我们以上的需求了。
那么,我们来看看underscore的debounce实现吧,是不是有点小兴奋٩(๑ᵒ̴̶͈᷄ᗨᵒ̴̶͈᷅)و
_.debounce
直接上源码:
从代码量上来看,underscore的实现功能应该要复杂点,但是整体的实现的策略和我们模拟的是一样的。
underscore
:我们不一样( ¯ ¨̯ ¯̥̥ )
首先我们可以发现多了一个
immediate
参数,从字面上理解应该是立即执行之类的功能。我们来看看代码的具体实现,这里我就放出带注释源码了。
本质回归现象
防抖的本质是通过减少实际逻辑处理来提高事件处理函数运行性能的手段,并没有实质上减少事件的触发次数。
那么对于函数的去抖debounce一般都有那些应用场景呢?看了这嘛久,最后还是要学以致用(๑˘ ˘๑)
(⊙o⊙)…暂时只想的到这嘛多,后面遇到了在来补充。
吼啦,debounce的解析先到这里吧。
最近也在看underscore的源码,以此来巩固自己的基础知识,应该不会写系列文章,但是遇到困惑的地方或者引发思考的东西,会用写blog的方式来系统整理相关的东西,写blog的过程就是学习的过程。
参考文档:
JavaScript专题之跟着underscore学防抖
若文中有知识整理错误或遗漏的地方请务必指出,非常感谢。如果对你有一丢丢帮助或引起你的思考,可以点赞鼓励一下作者=^_^=
The text was updated successfully, but these errors were encountered: