在前端开发中有一部分用户行为会频繁的触发事件执行,而对于DOM的操做、资源加载等耗费性能的处理,极可能会致使界面卡顿,甚至浏览器奔溃。函数的节流与防抖就是为了解决相似需求而产生的。php
节流实现思路就是定一个时间间隔,在这个时间间隔范围内,只会执行一次函数。
防抖实现思路是首次运行时把定时器赋值给一个变量,第二次执行时,若是间隔没超过定时器设定的时间则会清除掉定时器,从新设定定时器,依次反复,当咱们中止下来时,没有执行清除定时器,超过必定时间后触发回调函数html
// 1. 思考不用定时器能够实现么,让咱们试试 function throttle(fn, delay = 1000) { var time = Date.now(); return function() { if(Date.now()-time > 1000) { fn(); time = Date.now(); } else { return; } } } // 2. 有定时器为何不用呢,哈哈哈 function throttle(fn, delay = 1000) { var timer = null; return function(){ if (timer) {return;} else { timer = setTimeout(()=>{ fn.call(this,arguments); timer = null; },delay); } } } // test window.addEventListener('scroll', throttle(foo,1000)); function foo() { console.log('hello') }
// 1. 无定时器 // function debounce(fn, delay = 1000) { // var time = Date.now(); // return function(){ // if(Date.now()-time > 1000) { // fn(); // } else { // time = Date.now(); // return; // } // } // } // 2. 有定时器 function debounce(fn, delay = 1000) { var timer = null; return function(){ clearTimeout(timer); timer = setTimeout(()=>{ fn.call(this,arguments); timer = null; },delay); } } // test window.addEventListener('scroll', debounce(foo,1000)); function foo() { console.log('hello') }