一、函数防抖
    (1)一定事件段内,只执行一次函数。
    (2)间隔时间段内触发该事件,重新开始计时(创造新的Timeout)。

    1. function debonce (fn){
    2. let timer = null;
    3. return function(){
    4. clearTimeout(timer);
    5. timer = setTimeout(fn,3000)
    6. }
    7. }
    8. function eventHandler (){
    9. console.log('click')
    10. }
    11. function bindEvent (){
    12. let theDom = document.querySelector('#ua93bef8c'),
    13. debouncedCallback = debonce(eventHandler);
    14. theDom.onclick = debouncedCallback;
    15. //绑定原生点击事件 onclick 不是驼峰命名
    16. }
    17. bindEvent()

    封装防抖函数
    (1)第一次是否立即执行回调函数(比如提交数据时第一次不延迟)
    (2)间隔时间
    (3)加上清楚防抖的功能

    1. function eventHandler (){
    2. console.log('click')
    3. }
    4. function bindEvent (){
    5. let theDom = document.querySelector('#ua93bef8c'),
    6. debouncedCallback = debonce(eventHandler, 4000, true);
    7. theDom.onclick = debouncedCallback;
    8. //绑定原生点击事件 onclick 不是驼峰命名
    9. }
    10. bindEvent()
    11. function debonce(fn,time,triggerImmediately){
    12. let timer = null;
    13. let debounce = function(){
    14. if(timer){
    15. clearTimeout(timer)
    16. }
    17. let args = [...arguments],
    18. _self = this;
    19. //先判断是否立即触发函数
    20. if(triggerImmediately){
    21. let excute = !timer;
    22. timer = setTimeout(()=>{
    23. timer = null
    24. },time)
    25. if(excute){
    26. fn.apply(_self, args)
    27. }
    28. }else{
    29. timer = setTimeout(()=>{
    30. fn.apply(_self, args)
    31. }, time)
    32. }
    33. }
    34. debounce.remove = ()=>{
    35. clearTimeout(timer)
    36. timer = null
    37. }
    38. }

    三、节流
    一段间隔时间内,只执行一次事件

    1. function throttle (fn,waitingTime){
    2. let prevTime = new Date().getTime(),
    3. timer = null;
    4. return function(){
    5. if(timer) clearTimeout(timer)
    6. let currentTime = new Date().getTime(),
    7. _self = this,
    8. args = [...arguments];
    9. if( (currentTime - prevTime) >= waitingTime){
    10. fn.apply(_self, args)
    11. prevTime = currentTime
    12. }else{
    13. timer = setTimeout(function(){ fn.apply(_self, args) },waitingTime)
    14. }
    15. }
    16. }

    四、防抖与节流的区别
    防抖:n秒内,无论怎么触发事件,都不执行。
    节流:n秒内,无论怎么触发事件,只执行一次。
    应用场景:
    看具体需求
    (1)输入查询,间隔时间发送请求 => 节流
    (2)数据请求按钮点击 => 防抖,节流都行。 防抖,n秒内只执行一次。 节流,n秒内,不管怎么点,只执行一次。