什么都想学的小白菜 2023-04-20 14:02 采纳率: 87.5%
浏览 32
已结题

关于#javascript#的问题:防抖函数的作用域问题,有关改函数被多次触发,为什么可以获取到同一个timer

疑问求解:防抖函数的这个写法,重复触发后,timer 作为一个计时器被不停重置。但是我的理解是,在多次触发的时候 这个timer 与上一个 timer 是存在于同一个作用域内的吗?也就是此时的timer 与上一个timer 为什么会是同一个这个问题。可能是我钻牛角尖了,我错误的认为这个方法被触发的时候,是两个独立的作用域,但是我不理解为什么。


```javascript
var btn = document.getElementById('btn');
        function debounce (fn, delay) {
            let timer = null
            return function () {
                // 在规定时间内再次触发会先清除定时器后再重设定时器
                console.log(timer)
                clearTimeout(timer);
                timer = setTimeout(function () {
                    console.log(this)
                    fn.apply(this, arguments);
                }, delay);
            }
        }
        function fn () {
            console.log('防抖')
        }
        btn.onclick = function () {
            debounce(fn, 3000)()
        }


```

  • 写回答

2条回答 默认 最新

  • 乘风xs 2023-04-20 14:14
    关注

    这个问题涉及到函数闭包的知识点。你可以看到,timer这个变量是在debounce函数中定义的,所以timer存在于debounce的作用域中,而我们调用的函数是debounce的返回值。正常情况下,debounce函数返回结果之后,它的生命周期就结束了,然后它的返回值当中包含着timer的引用,所以timer始终没有被垃圾回收掉,所以debounce函数的作用域也就一直存在,而无论调用多少次的onClick,它所用到的timer都是最开始debounce函数中的那个timer.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月28日
  • 已采纳回答 4月20日
  • 赞助了问题酬金15元 4月20日
  • 创建了问题 4月20日

悬赏问题

  • ¥20 绿盟安全扫描--检测到目标站点存在javascript框架库漏洞
  • ¥30 Android STD快速启动
  • ¥15 如何使用simulink建立一个永磁同步直线电机模型?
  • ¥30 天体光谱图的的绘制并得到星表
  • ¥15 PointNet++的onnx模型只能使用一次
  • ¥20 西南科技大学数字信号处理
  • ¥15 有两个非常“自以为是”烦人的问题急期待大家解决!
  • ¥30 STM32 INMP441无法读取数据
  • ¥15 R语言绘制密度图,一个密度曲线内fill不同颜色如何实现
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包