【发布时间】:2019-09-24 13:49:37
【问题描述】:
我在网上找到了一个很棒的 debounce() 函数代码,但是我很难将它从 ES5 转换为 ES6。
问题如下:当我使用 ES5 实现时,一切正常。窗口被调整大小,console.log()立即被触发,随后的调整被忽略,直到我指定的 500 毫秒之后。
然而,在 ES6 实现中,第一次调用会立即生效……但之后每次调用都会也延迟 500 毫秒,即使在冷却后也是如此!
如果有人知道我做错了什么,我将非常感谢一些帮助。
例子:
function debounceES5(func, wait, immediate) {
var timeout;
return function () {
var context = this, args = arguments;
var later = function() {
timeout = null;
if (!immediate) func.apply(context, args);
};
var callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func.apply(context, args);
};
};
const debounceES6 = (callback, wait, immediate=false) => {
let timeout = null
return (...args) => {
const callNow = immediate && !timeout
const next = () => callback(...args)
clearTimeout(timeout)
timeout = setTimeout(next, wait)
if (callNow) { next() }
}
}
document.querySelector('.es5').addEventListener('click', debounceES5(() => {console.log('clicked')}, 1000, true))
document.querySelector('.es6').addEventListener('click', debounceES6(() => {console.log('clicked')}, 1000, true))
Click both of these buttons fast and see how they react differently
<br />
<button class="es5">ES5</button>
<button class="es6">ES6</button>
【问题讨论】:
-
通过使用箭头函数,您的内部函数使用了错误的
this。这是从那时起您无法使用箭头函数的众多情况之一,您永远无法从调用者那里获得this。 -
代码@gman中没有
this -
为什么不在 ES6 代码中使用
;? (不是问题所在) -
@JaromandaX,工作版内部函数第一行是
var context = this -
@JaromandaX ES6 更宽容,我喜欢它更干净!
标签: javascript ecmascript-6 ecmascript-5 debounce