在什么情况下使用上下文?

时间:2016-08-15 18:55:23

标签: javascript this debouncing

我正在研究有关去抖动解决方案的帖子:

  

Can someone explain the "debounce" function in Javascript

我正在努力想到

的情况
func.apply(context, arguments);

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

func();

我认为99%的几率只会被用作一个功能。在什么情况下这将被附加到一个对象?有人可以在这里展示一个例子吗?感谢。

1 个答案:

答案 0 :(得分: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)