关于函数防抖和函数节流
2018-11-06 09:35
323 查看
函数防抖与节流是很相似的概念,但它们的应用场景不太一样。
函数防抖简单来说就像法师释放技能的读条,如果你在施法读条时重复选择释放技能,那么读条时间将重新计算。
- 举个例子:
function debounce(func, delay) { var timeout; return function(e) { console.log("清除",timeout,e.target.value) clearTimeout(timeout); var context = this, args = arguments console.log("新的",timeout, e.target.value) timeout = setTimeout(function(){ console.log("----") func.apply(context, args); },delay) }; }; var validate = debounce(function(e) { console.log("change", e.target.value, new Date-0) }, 380); // 绑定监听 document.querySelector("input").addEventListener('input', validate);
在一定的延迟内重复点击按钮,如果定时器已经开始执行,则清空定时器,重新开始计时,如果没有重复执行,则延迟若干时间后执行一次。
而函数节流,简单表达的话则是法师的技能只能在CD后再度释放,也就是说限制函数的使用频率,但是重复的触发事件一定能再次执行函数。
举个例子:捆绑在按钮上的抽奖事件,每当触发抽奖事件后的10秒内点击按钮均为无效,只能在10秒后的点击事件才能再度触发抽奖。
function throttle(fn, threshhold) { var timeout var start = new Date; var threshhold = threshhold || 160 return function () { var context = this, args = arguments, curr = new Date() - 0 clearTimeout(timeout)//总是干掉事件回调 if(curr - start >= threshhold){ console.log("now", curr, curr - start)//注意这里相减的结果,都差不多是160左右 fn.apply(context, args) //只执行一部分方法,这些方法是在某个时间段内执行一次 start = curr }else{ //让方法在脱离事件后也能执行一次 timeout = setTimeout(function(){ fn.apply(context, args) }, threshhold); } } } var mousemove = throttle(function(e) { console.log(e.pageX, e.pageY) }); // 绑定监听 document.querySelector("#panel").addEventListener('mousemove', mousemove);
函数节流和函数防抖的对比。
**函数防抖:**如果不断重复函数节流,如果触发频率高于防抖限制,则函数防抖会不断重置定时器,事件永远不会被触发。
**函数节流:**如果不断重复触发函数节流,函数会根据设定限制函数的执行频率。
阅读更多