1. 防抖,当一次事件发生后,事件处理器要等一定阈值的时间,如果这段时间过去后 再也没有 事件发生,就处理最后一次发生的事件。假设还差 0.01 秒就到达指定时间,这时又来了一个事件,那么之前的等待作废,需要重新再等待指定时间
    1. function debounce(fn, wait=50, immediate=false) {
    2. let timer;
    3. return function() {
    4. if(immediate) {
    5. fn.apply(this, arguments)
    6. }
    7. if(timer) clearTimeout(timer)
    8. timer = setTimeout(() => {
    9. fn.apply(this, arguments)
    10. }, wait)
    11. }
    12. }
    13. // 例子:滚动防抖
    14. function fn() {
    15. console.log('do something')
    16. }
    17. var _fn = debounce(fn, 1000);
    18. window.addEventListener('scroll', _fn);
    19. window.removeEventListener('scroll',_fn);
    1. 节流,事件在一个管道中传输,加上这个节流阀以后,事件的流速就会减慢。实际上这个函数的作用就是如此,它可以将一个函数的调用频率限制在一定阈值内,例如 1s,那么 1s 内这个函数一定不会被调用两次
    1. function throttle(fn, wait=50) {
    2. let prev = new Date().getTime();
    3. return function() {
    4. const now = new Date().getTime();
    5. if (now - prev > wait) {
    6. prev = now;
    7. fn.apply(this, arguments);
    8. }
    9. }
    10. }
    1. 通过参数切换防抖和节流
    1. const throttle = function(fn, delay=50, isDebounce=false) {
    2. let timer;
    3. let prev = new Date().getTime();
    4. return function(...args) {
    5. if(isDebounce) {
    6. if(timer) clearTimeout(timer);
    7. timer = setTimeout(() => {
    8. fn.apply(this, args);
    9. }, delay)
    10. } else {
    11. const now = new Date().getTime();
    12. if(now - prev > delay) {
    13. prev = now;
    14. fn.apply(this, args);
    15. }
    16. }
    17. }
    18. }