gpt4 book ai didi

javascript - clearTimeout 未按预期方式工作

转载 作者:行者123 更新时间:2023-11-28 10:38:12 24 4
gpt4 key购买 nike

我正在尝试在普通 JavaScript 中实现 debounce 函数。我不确定为什么clearTimeout不清除超时对象。在每个事件触发器中,回调函数setTimeout如果距上次调用不超过5秒,则清除刚刚创建的超时。但我没有看到超时被清除。

HTML:

<html>

<head>

</head>

<body>
<div id='move'>

</div>
<div id='result'>

</div>
</body>

JS:

 var area;
var result;

function init() {
area = document.querySelector('#move');
area.addEventListener('mousemove', debouce1);
result = document.querySelector('#result');
}

function updateResult(event) {
let xCordinate = event.clientX;
let yCordinate = event.clientY;
result.textContent = `${xCordinate} , ${yCordinate}`;
}



function debounce1(fn, time) {
let firstTime = true;
let start;
return function() {
if (firstTime) {
fn.apply(null, arguments);
firstTime = false;
start = new Date();
} else {
let now = new Date();
let timer = setTimeout(() => {
fn.apply(null, arguments);
start = new Date();
}, time)
if (now - start < 4000) {
console.log('too fast');
clearTimeout(timer);
console.log(now - start);
console.log(timer);
start = new Date();
}

}
}
init();

最佳答案

发布的代码存在不少问题。

area.addEventListener('mousemove', debouce1);

这是debounce1而不是debouce1

它应该是这样的

area.addEventListener('mousemove', debounce1(updateResult, 1000));

使用 null 调用 fn.apply 意味着代码会丢失这样一个事实:在将 this 设置为监听器的元素的情况下调用事件处理程序被绑定(bind)到

代码正在调用 debounce1 内的 init

另一个小注释,您可以调用 Date.now()performance.now() 来获取将时间表示为数字的数字,这可以说比创建 Date 对象。

也不确定调用 clearTimeout 有何意义。

这是 debounce1 的另一个实现。它传递最后一组参数和最后一个 this。使 updateResult 显示 this.id,以便我们可以检查 this 对于回调来说是否正确。

'use strict';

const result = document.querySelector('#result');

function init() {
const area = document.querySelector('#move');
area.addEventListener('mousemove', debounce1(updateResult, 1000));
}

function updateResult(event) {
const xCordinate = event.clientX;
const yCordinate = event.clientY;
result.textContent = `${this.id}: ${xCordinate} , ${yCordinate}`;
}

function debounce1(fn, time) {
let lastArgs;
let lastThis;
let timeoutQueued;
let debounceTime = 0;

return function(...args) {
lastThis = this;
lastArgs = [...args];
if (!timeoutQueued) {
timeoutQueued = true;
setTimeout(function() {
timeoutQueued = false;
fn.apply(lastThis, lastArgs);
}, debounceTime);
debounceTime = time;
}
};
};

init();
#move {
background: red;
height: 50px;
}
<div id='move'></div>
<div id='result'>

关于javascript - clearTimeout 未按预期方式工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57032833/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com