【问题标题】:Under what circumstances does the context get used?在什么情况下使用上下文?
【发布时间】:2016-12-22 00:29:13
【问题描述】:

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

Can someone explain the "debounce" function in Javascript

我很难想出一种情况

func.apply(context, arguments);

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

func();

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

【问题讨论】:

  • function() { console.log("hello "+ this.name); } 这是一个使用上下文的函数function.call({name: "bob"}) 这将使它改变它的输出。一个重要的例子Array.prototype.slice.call(arguments) 是一个非常常见的模式,它使用arguments 对象的上下文调用slice 来生成一个数组。简单来说,有些函数使用了上下文,这种情况下call/apply可以很好地提供它,其他函数没有,在这种情况下设置上下文没有任何区别。因此,不设置上下文将使某些调用失败。添加它更通用。
  • @Vid 我很欣赏你的快速评论,但我真的不是在问上下文是如何工作的。我很好奇这个去抖动函数被用作方法而不是普通函数的例子。我只是看不到在这里使用“应用”有任何用处。不过感谢您的评论。
  • 好吧,你不知道什么函数会被去抖动。它可能是有或没有上下文的,因此添加上下文是有用的。你不能保证一个函数在去抖动时会或不会使用上下文。
  • 更不用说保留参数
  • ^ @aw04 也是这么说的。我专注于上下文,但实际上,这些论点可能会比这更多次。

标签: javascript this debouncing


【解决方案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);
     }; 
};

首先,contextsetTimeout 回调之外被捕获。所以无论this 绑定规则用于确定初始上下文(这取决于稍后如何调用 depounced 函数),它都会被传递给回调函数。

或者,您可以执行以下操作:

setTimeout(function() {
  ...
  func.apply(this, args);
}.bind(this), wait);

发生的第二件事是保留参数。 apply 在这里用作传递参数的一种方式(同样,重要的是在 setTimeout 回调之外捕获),您将传递给原始函数。因为它需要一个array(而不是call),所以它很容易转移。

所以如果你有类似的东西:

debouncedFunction(a, b)

内部的func 被适当地称为func(a, b)

【讨论】:

  • 非常感谢您的详细解释。现在我可以理解上下文部分了。但是对于参数部分,是不是简单地调用一个函数就像一个更好的方法:func(args)?为什么还要麻烦 apply 来传递参数?
  • 所以关键是 apply 允许您将所有年龄作为数组传递。你这样做的方式,想象一个需要两个或三个参数的函数。第一个是 args 的数组,其他的将是未定义的……这显然不是你想要的。这有意义吗?
【解决方案2】:

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

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

foo.method(arg1, arg2);

那么你也应该会写:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 2017-11-30
    • 2014-01-25
    • 2011-07-08
    • 2011-03-28
    相关资源
    最近更新 更多