假设网站有个搜索框, 用户输入文本咱们会自动联想匹配出一些结果供用户选择,咱们可能首先想到的作法就是监听keypress事件, 而后异步查询结果. 可是若是用户快速的输入了一串字符, 假设是10个字符, 那么就会在瞬间触发10次请求, 这无疑不是咱们想要的, 咱们想要的是用户中止输入的时候才去触发查询的请求.app
函数防抖就是让某个函数在上一次执行后, 知足等待某个时间内再也不触发此函数后再执行, 而在这个等待时间内再次触发此函数, 等待时间会从新计算.异步
underscore.js的函数防抖定义: _.debounce(fn, wait, [immediate]);函数
debounce接收三个参数: @params fn: 须要进行函数防抖的函数; @params wait: 须要等待的时间, 单位为毫秒; @params immediate: 若是为true, 则debounce会在调用时马上执行一次fn, 而不须要等到wait结束后. _.debounce = function(fn, wait, immediate) { var timeout, args, context, timestamp, result; var later = function() { var last = _.now() - timestamp; if(last < wait && last >= 0) { timeout = setTimeout(later, wait - last); } else { timeout = null; if(!immediate) { result = fn.apply(context, args); if(!timeout) { context = args = null; } } } }; return function() { context = this; args = arguments; timestamp = _.now(); var callNow = immediate && !timeout; if(!timeout) { timeout = setTimeout(later, wait); } if(callNow) { result = fn.apply(context, args); context = args = null; } return result; } }; // demo: $('#input').keypress(_.debounce(function() { //异步调用查询 }, 300));