当前位置: 首页 > 知识库问答 >
问题:

javascript - 为什么节流函数中的定时器ID没有按预期变化?

赫连正初
2024-11-16

关于节流函数中定时器id的变化问题

        let i = 0
        function mouseMove() {
            document.querySelector('.box').innerHTML = i++
        }
        function save(fn, t) {
            let timer = null

            return function () {

                if (!timer) {
                    timer = setTimeout(function () {

                        fn()
                        console.log(timer)
                        timer = null
                    }, t)
                }

            }
        }

        document.querySelector('.box').addEventListener('mousemove', save(mouseMove, 2000))

试图在setTimeout期间打印了这个定时器

最后在盒子内没有间歇的滑动鼠标,打印出来的timer没有3是为啥? 后面无论我怎么滑动鼠标,打印的数字都是按顺序递增的,很奇怪。而且把打印放在fn前后结果都一样。

共有2个答案

都才俊
2024-11-16

setTimeout 的返回值 timeoutID 是一个正整数,表示由 setTimeout() 调用创建的定时器的标识符。可以将这个值传递给 clearTimeout() 来取消该定时器。

这个正整数仅表示定时器 ID,不具有其他含义,不一定是 1,2,3……。当然,大部分浏览器使用自增 id 实现。如果在其他地方调用了 setTimeout 可能会导致某个 ID 被其他定时器占有。

章承基
2024-11-16
### 解释

在你的节流函数实现中,`timer` 变量被设计为在 `setTimeout` 回调执行后重置为 `null`。这意味着每次 `setTimeout` 触发的函数执行完毕后,`timer` 都会变成 `null`,从而允许在下一次事件触发时重新设置一个新的 `setTimeout`。

关于你提到的 "打印出来的 `timer` 没有3" 的问题,这是因为 `timer` 的值在你打印它的时候已经被重置为 `null` 了。在 `setTimeout` 的回调函数中,`fn()` 被调用之后,紧接着 `timer = null` 被执行,这就覆盖了之前 `setTimeout` 返回的定时器ID。

每次你移动鼠标时,如果 `timer` 为 `null`,则会创建一个新的 `setTimeout`,并且这个新的 `setTimeout` 会返回一个新的定时器ID。但是,由于这个新的定时器ID只存在于 `setTimeout` 的回调被调用之前的那一小段时间内(即在 `fn()` 调用和 `timer = null` 执行之间),因此你很少有机会捕获到这个新ID(因为它几乎立即就被重置为 `null` 了)。

如果你在 `fn()` 调用之前打印 `timer`,你会看到每次事件触发时生成的定时器ID(在它们被重置为 `null` 之前)。然而,由于 `console.log(timer)` 在 `fn()` 调用之后执行,你总是看到 `null`,因为此时 `timer` 已经被重置了。

如果你想要捕获并观察这些定时器ID,你需要在它们被重置之前打印它们,比如在调用 `fn()` 之前。但是请注意,这样做会改变节流函数的正常行为,因为它会延迟 `timer` 被重置为 `null` 的时间。
 类似资料:
  • 我的编译器是和。 输出如下: 具有线程本地存储持续时间的对象的析构函数...保证被调用。

  • 这是我想要得到的输出: 代码如下:https://jsfiddle.net/t5ewp8ax/ 似乎台词: 被正确解析为

  • 我正在尝试解析下面的XML文件并基于它创建一个JTree。 “窗口01”将添加到根节点“对象列表”,但“页面01”节点不会显示在“窗口01”节点下。下面给出了使用的源代码。请帮忙!!! 这是主课。编译时不会显示错误或警告。

  • 问题内容: 最近,我开始使用Python3,它缺乏xrange的好处。 简单的例子: 1) Python2: 2) Python3: 结果分别是: 1) 1.53888392448 2) 3.215819835662842 这是为什么?我的意思是,为什么xrange被删除了?这是学习的好工具。对于初学者来说,就像我自己一样,就像我们都处在某个时刻。为什么要删除它?有人可以指出我正确的PEP,我找不

  • 问题内容: 我正在使用Java和Selenium编写测试。我需要将另一个元素内的最后一个元素,所以我使用函数,但问题是,当我申请时,它并不总是带给我最后一个: 至 得到,它带给我: 但是当我将其应用于: 它带给我: 问题答案: 这是XPath混乱的常见原因。 首先是简单的部分: 选择文档中的所有元素。 选择文档中属于元素后代的所有元素。 到目前为止,正常的东西。 接下来是棘手的部分: 要在 兄弟姐

  • 我正在编写一个简单的应用程序来保存和查找位置。我用的是猫鼬和茉莉节点。 用户CRUD测试工作符合预期。但是,我单独创建了用户来测试不同的自定义验证。我还通过清除集合并重新加载所有用户来启动测试,以确保在启动save/update/etc测试之前所有测试数据都是良好的。 对于位置,我也在做同样的事情,但我有几十个位置,我想使用数组加载它们。。。并在整个过程中测试负载,确保其正常工作。 如果我只做一个

  • 本文向大家介绍函数式组件有没有生命周期?为什么?相关面试题,主要包含被问及函数式组件有没有生命周期?为什么?时的应答技巧和注意事项,需要的朋友参考一下 没有生命周期 因为他没有继承React.Component 所以也不需要render()

  • 我正在尝试使用JS SDK在Dropbox上上传一个文件。下面是我试图调用函数的html代码: 这是定义函数的文件 但是,由于我不知道的原因,我的函数不能被调用。我得到错误“referenceerror:Dropupload is not defined”,我不知道这是否与问题有关,但我得到另一个错误:“syntaxerror:import declarations may only at top