函数节流
函数节流是指控制一个函数的执行频率或间隔(就像控制水流的闸门一样),Underscore提供了debounce()和throttle()两个方法用于函数节流。
为了更清楚地描述这两个方法,假设我们需要实现两个需求:
需求1:当用户在文本框输入搜索条件时,自动查询匹配的关键字并提示给用户(就像在Tmall输入搜索关键字时那样)
首先分析第1个需求,我们可以绑定文本框的keypress事件,当输入框内容发生变化时,查询匹配关键字并展示。假设我想查询“windows phone”,它包含13个字符,而我输入完成只花了1秒钟(好像有点快,就意思意思吧),那么在这1秒内,调用了13次查询方法。这是一件非常恐怖的事情,如果Tmall也这样实现,我担心它会不会在光棍节到来之前就挂掉了(当然,它并没有这么脆弱,但这绝对不是最好的方案)
更好的方法是,我们希望用户已经输入完成,或者正在等待提示(也许他懒得再输入后面的内容)的时候,再查询匹配关键字。
最后我们发现,在我们期望的这两种情况下,用户会暂时停止输入,于是我们决定在用户暂停输入200毫秒后再进行查询(如果用户在不断地输入内容,那么我们认为他可能很明确自己想要的关键字,所以等一等再提示他)
这时,利用Underscore中的debounce()函数,我们可以轻松实现这个需求:
<input type="text" id="search" name="search" />
<script type="text/javascript">
var query = _(function() {
// 在这里进行查询操作
}).debounce(200);
$('#search').bind('keypress', query);
</script>
你能看到,我们的代码非常简洁,节流控制在debounce()方法中已经被实现,我们只告诉它当query函数在200毫秒内没有被调用过的话,就执行我们的查询操作,然后再将query函数绑定到输入框的keypress事件。
query函数是怎么来的?我们在调用debounce()方法时,会传递一个执行查询操作的函数和一个时间(毫秒数),debounce()方法会根据我们传递的时间对函数进行节流控制,并返回一个新的函数(即query函数),我们可以放心大胆地调用query函数,而debounce()方法会按要求帮我们做好控制。
需求2:当用户拖动浏览器滚动条时,调用服务器接口检查是否有新的内容
再来分析第2个需求,我们可以将查询方法绑定到window.onscroll事件,但这显然不是一个好的做法,因为用户拖动一次滚动条可能会触发几十次甚至上百次onscroll事件。
我们是否可以使用上面的debounce()方法来进行节流控制?当用户拖动滚动条完毕后,再查询新的内容?但这与需求不符,用户希望在拖动的过程中也能看到新内容的变化。
因此我们决定这样做:用户在拖动时,每两次查询的间隔不少于500毫秒,如果用户拖动了1秒钟,这可能会触发200次onscroll事件,但我们最多只进行2次查询。
利用Underscore中的throttle()方法,我们也可以轻松实现这个需求:
<script type="text/javascript">
var query = _(function() {
// 在这里进行查询操作
}).throttle(500);
$(window).bind('scroll', query);
</script>
代码仍然十分简洁,因为在throttle()方法内部,已经为我们实现的所有控制。
你可能已经发现,debounce()和throttle()两个方法非常相似(包括调用方式和返回值),作用却又有不同。
它们都是用于函数节流,控制函数不被频繁地调用,节省客户端及服务器资源。
debounce()方法关注函数执行的间隔,即函数两次的调用时间不能小于指定时间。
throttle()方法更关注函数的执行频率,即在指定频率内函数只会被调用一次。
分享到:
相关推荐
JavaScript函数节流和防抖是两种常见的性能优化技术,它们主要用于限制函数在特定时间段内的执行频率,以提高应用的响应速度和用户体验。这两种技术在处理高频率触发的事件,如页面滚动、窗口大小改变、输入框实时...
函数节流(throttle)和函数防抖(debounce)是JavaScript性能优化的重要技巧,它们主要用于处理频繁触发的事件,如窗口滚动、页面加载、输入框输入等场景。 **函数防抖(debounce)** 是一种策略,其主要目的是在...
JavaScript函数节流是一种优化技术,主要用于处理高频率触发的事件,如窗口的`resize`或鼠标的`mousemove`事件。这种技术的目的是限制函数的执行次数,以避免在短时间内过度消耗资源,比如频繁的DOM操作或网络请求。...
JavaScript函数节流是一种优化技术,主要用于控制函数执行的频率,以避免在高频率触发的事件(如窗口resize、滚动或触摸移动)中过度消耗系统资源,尤其是DOM操作。这种技术对于提升网页性能至关重要,因为它可以...
JavaScript函数节流是一种控制函数在一定时间间隔内仅被触发一次的技术,旨在优化前端性能,尤其在处理高频事件(如窗口resize、滚动、连续的鼠标移动等)时防止过多的函数调用。函数节流的核心思想是确保函数不会在...
JavaScript 函数节流是一种优化技术,它用于控制函数的执行频率,以防止因频繁调用导致性能问题。在JavaScript中,由于单线程的特性,大量计算或长时间运行的代码可能会阻塞UI线程,影响用户体验,特别是对于事件...
函数节流和函数防抖,两者都是优化高频率执行js代码的一种手段。 大家大概都知道旧款电视机的工作原理,就是一行行得扫描出色彩到屏幕上,然后组成一张张图片。由于肉眼只能分辨出一定频率的变化,当高频率的扫描,...
JavaScript中的函数节流(throttle)和函数去抖(debounce)是两种常见的优化策略,它们主要用于处理频繁触发的事件,如窗口滚动、输入验证、页面加载等,以提高性能和用户体验。 **函数节流(throttle)**: 函数...
js 函数节流,里面大概介绍了javascript函数节流的知识,并一实例配置之
函数节流案例
setTimeout函数在JS中的奇妙用法和函数节流 在JS中,setTimeout函数是一个非常重要的函数,它可以用来实现函数节流,避免函数在短时间内连续被调用,从而提高性能和防止浏览器崩溃。 什么是函数节流? 函数节流...
这里我们将深入探讨`cookie`操作、`DOM`操作、浏览器前缀处理以及函数节流技术这四个核心主题,这些都是JavaScript开发中不可或缺的部分。 首先,让我们来看看`cookie`操作。Cookie是一种在客户端存储数据的方法,...
函数节流// 函数节流// 若mustRunDelay >> delay,近似于debounce。// 所以else语句的setTimeout一定要有if (c
以上只是JavaScript函数特性的一部分,JavaScript函数还有更多高级特性和用途,如函数组合、柯里化、节流、防抖等。深入理解和熟练掌握这些知识点,将有助于你更好地编写高效、可维护的JavaScript代码。对于初学者来...