关于节流函数中定时器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前后结果都一样。
setTimeout
的返回值 timeoutID 是一个正整数,表示由 setTimeout() 调用创建的定时器的标识符。可以将这个值传递给 clearTimeout() 来取消该定时器。
这个正整数仅表示定时器 ID,不具有其他含义,不一定是 1,2,3……。当然,大部分浏览器使用自增 id 实现。如果在其他地方调用了 setTimeout 可能会导致某个 ID 被其他定时器占有。
### 解释
在你的节流函数实现中,`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