我正在研究该帖子以寻求去抖动的解决方案:
我正在努力想一个情况
func.apply(context, arguments);
是必要的,而不仅仅是使用
func();
我认为 99% 的机会它只会被用作一个函数。在什么情况下它会附加到一个对象上?有人可以在这里举个例子吗?谢谢。
我正在研究该帖子以寻求去抖动的解决方案:
我正在努力想一个情况
func.apply(context, arguments);
是必要的,而不仅仅是使用
func();
我认为 99% 的机会它只会被用作一个函数。在什么情况下它会附加到一个对象上?有人可以在这里举个例子吗?谢谢。
debounce
旨在使用以任何方式调用的函数。如果使用上下文或参数调用被去抖动的函数,则在使用 调用时需要传递这些函数debounce
。
因此,如果您通常会拨打以下电话:
foo.method(arg1, arg2);
那么你也应该能够写:
debounced_method = debounce(foo.method);
foo.debounced_method(arg1, arg2);
然后当它调用该方法时,它会收到this = foo
and arguments = arg1, arg2
。
关于使用,这里有两件事apply
:
function debounce(func, wait, immediate) {
var timeout;
return function() {
var context = this,
args = arguments;
clearTimeout(timeout);
timeout = setTimeout(function() {
timeout = null;
if (!immediate) func.apply(context, args);
}, wait);
if (immediate && !timeout) func.apply(context, args);
};
};
首先,在回调context
之外被捕获。setTimeout
因此,无论使用何种this
绑定规则来确定初始上下文(这取决于稍后如何调用 depounced 函数),它都会被传递给回调函数。
或者,您可以执行以下操作:
setTimeout(function() {
...
func.apply(this, args);
}.bind(this), wait);
发生的第二件事是保存论点。apply
这里被用作传输参数(同样重要的是在setTimeout
回调之外捕获)的一种方式,您将传递给原始函数。因为它需要一个array
(而不是call),所以它很容易转移。
所以如果你有类似的东西:
debouncedFunction(a, b)
内部func
适当地称为func(a, b)
。