问答

原生js实现防抖函数,为什么这么写无法实现防抖效果

作者:admin 2021-04-20 我要评论

debounce(handleCreateWebSocket,2*1000)() 每次触发这个点击事件,无法实现防抖效果,点击多少次,执行了多少次,为什么? var btnCreateWebSocket = document....

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)
debounce(handleCreateWebSocket,2*1000)()

每次触发这个点击事件,无法实现防抖效果,点击多少次,执行了多少次,为什么?

var btnCreateWebSocket = document.querySelector('.btn-create-webSocket-container')
if (btnCreateWebSocket) {
  btnCreateWebSocket.onclick = function () {
    console.log('btnCreateWebSocket')
    // if(!chatGlobalData['connect']) {
    clearTimeout(timerCreateWebSocket)
    timerCreateWebSocket = setTimeout(function(){
        createWebSocket()
    }, 2*1000)
    // }
 }
}

防抖函数实现

function debounce (func, wait){
    var timeout;
    return function(){
        var self = this; // 因为apply会改变this的指向性
        clearTimeout(timeout)
        timeout = setTimeout(function(){
            // setTimeout 属于 window 对象
            // 直接使用func.apply(this) 会在add函数里面改变this为window,
            // 这里也可以用ES6的箭头函数
            func.apply(self)
        }, wait)
    }
}
###

因为你写的timerCreateWebSocket是在函数内的,每次刷新都重新定义为undefined,而下方使用闭包,timeout变量的状态能保存。

###

按理说你的写法是可以实现防抖的,所以你可能误解了防抖效果,你的 console.log 应该放在 createWebSocket() 上一行,这样就能确保你看到的打印效果是防抖之后的效果。
但是这样的写法并不地道,因为意外创建了一个全局变量 timerCreateWebSocket,相关知识在这里不赘述,总之是不推荐的写法。

这样应该可行:

btnCreateWebSocket.onclick = (function() {
    var timerCreateWebSocket;
    return function () {
        console.log('btnCreateWebSocket')
        // if(!chatGlobalData['connect']) {
        clearTimeout(timerCreateWebSocket)
        timerCreateWebSocket = setTimeout(function(){
            createWebSocket()
        }, 2*1000)
        // }
     }
})();

使用 debounce 的时候是将 debounce 执行返回的函数作为回调函数,而这种写法是将 IIFE 执行返回的函数作为回调函数——重点是要维持一个每次执行点击回调时访问都一致的定时器句柄timerCreateWebSockettimeout

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • nginx响应速度很慢

    nginx响应速度很慢

  • 点击选中的多选框,会在已选那一栏显示

    点击选中的多选框,会在已选那一栏显示

  • PHP 多态的理解

    PHP 多态的理解

  • 关于C语言中static的问题

    关于C语言中static的问题

腾讯云代理商
海外云服务器