JS防抖与节流(性能优化)
声明:不是原创,只是自己记录,关注vue社区公众号吧;
防抖:动作停止后的时间超过设定的时间时执行一次函数。注意:这里的动作停止表示你停止了触发这个函数,从这个时间点开始计算,当间隔时间等于你设定时间,才会执行里面的回调函数。如果你一直在触发这个函数并且两次触发间隔小于设定时间,则函数一直不会执行。
简单实现:
1 function debance(fn, delay) { 2 let timer = null; 3 return () => { 4 if (timer) { 5 clearTimeout(timer); 6 } 7 timer = setTimeout(() => { 8 fn(); 9 }, delay); 10 }; 11 } 12 13 window.addEventListener( 14 "scroll", 15 debance(() => { 16 console.log(111); 17 }, 1000) 18 );
防抖应用场景:
1. search搜索联想,用户在不断输入值时,用防抖来节约请求资源
2.window触发resize的时候,不断的调整浏览器窗口大小会不断的触发这个事件,用防抖来让其只触发一次
节流:一定时间内执行的操作只执行一次,也就是说即预先设定一个执行周期,当调用动作的时刻大于等于执行周期则执行该动作,然后进入下一个新周期。
简单实现:
1 //方法一:设置一个标志 2 function throttle(fn, delay) { 3 let flag = true; 4 return () => { 5 if (!flag) return; 6 flag = false; 7 timer = setTimeout(() => { 8 fn(); 9 flag = true; 10 }, delay); 11 }; 12 } 13 //方法二:使用时间戳 14 function throttle(fn, delay) { 15 let startTime=new Date() 16 return () => { 17 let endTime=new Date() 18 if (endTime-startTime>=delay){ 19 fn() 20 startTime=endTime 21 }else{ 22 return 23 } 24 }; 25 } 26 window.addEventListener( 27 "scroll", 28 throttle(() => { 29 console.log(111); 30 }, 1000) 31 );
节流应用场景:
1. 鼠标不断点击触发,mousedown(单位时间内只触发一次)
2. 监听滚动事件,比如是否滑到底部自动加载更多(懒加载),用throttle来判断
小凤凰newObject