防抖函数

 1 /**
 2  * 防抖函数
 3  * @param {*} func 防抖后要执行的回调
 4  * @param {*} wait 等待时间
 5  * @param {*} immediate 
 6  */
 7 function debounce(func, wait, immediate) {
 8   let timeout, args, context, timestamp, result;
 9 
10   const later = function () {
11     // 距上一次触发时间间隔
12     const last = +new Date() - timestamp;
13 
14     // 上次被包装函数被调用时间间隔last小于设定时间间隔wait
15     if (last < wait && last > 0) {
16       timeout = setTimeout(later, wait - last);
17     } else {
18       timeout = null;
19       // 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用
20       if (!immediate) {
21         result = func.apply(context, args);
22         if (!timeout) context = args = null;
23       }
24     }
25   };
26 
27   return function (...args) {
28     context = this;
29     timestamp = +new Date();
30     const callNow = immediate && !timeout;
31     // 如果延时不存在,重新设定延时
32     if (!timeout) timeout = setTimeout(later, wait);
33     if (callNow) {
34       result = func.apply(context, args);
35       context = args = null;
36     }
37 
38     return result;
39   };
40 }

 

posted @ 2020-10-07 19:02  浪魔  阅读(197)  评论(0编辑  收藏  举报