2

我正在研究该帖子以寻求去抖动的解决方案:

有人可以解释 Javascript 中的“去抖动”功能吗

我正在努力想一个情况

func.apply(context, arguments);

是必要的,而不仅仅是使用

func();

我认为 99% 的机会它只会被用作一个函数。在什么情况下它会附加到一个对象上?有人可以在这里举个例子吗?谢谢。

4

2 回答 2

1

debounce旨在使用以任何方式调用的函数。如果使用上下文或参数调用被去抖动的函数,则在使用 调用时需要传递这些函数debounce

因此,如果您通常会拨打以下电话:

foo.method(arg1, arg2);

那么你也应该能够写:

debounced_method = debounce(foo.method);
foo.debounced_method(arg1, arg2);

然后当它调用该方法时,它会收到this = fooand arguments = arg1, arg2

于 2016-08-15T19:18:28.937 回答
1

关于使用,这里有两件事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)

于 2016-08-15T19:38:59.033 回答