首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用_.throttle限制.apply方法的速率

使用_.throttle限制.apply方法的速率
EN

Stack Overflow用户
提问于 2015-08-30 05:49:45
回答 1查看 195关注 0票数 0

有没有可能对this[act].apply(this, data)这样的东西进行速率限制、节流或去抖动?带下划线或其他什么?我试过很多东西,比如

_.throttle(/* different permutations of combined args */)

_.throttle.apply(/* same */)

_.throttle.apply(myArgs)(throttleArgs)

_.throttle(throttleArgs).apply(myArgs)

有些会产生错误,有些会冻结执行,有些会调用apply方法(正确的作用域和参数,但没有节流)。有什么想法吗?使用CoffeeScript,这些都是类方法。

EN

回答 1

Stack Overflow用户

发布于 2015-08-30 13:20:44

由于您正在调用的原始函数

代码语言:javascript
复制
this[act].apply(this, data)

使用this,我假设您是从对象的方法中调用它的。问题是,如何让this从这里到那里?许多高阶函数被设计为使用与调用它们本身相同的this调用底层函数,使用以下类型的框架:

代码语言:javascript
复制
function higher_order_function(fn) {
  return function() {
    return fn.apply(this, arguments);
  };
}

这意味着,如果我有一个带有方法的对象

代码语言:javascript
复制
var obj = {
  val: 42,
  print: function() { console.log(this.val); }
}

然后我想转换一下print函数:

代码语言:javascript
复制
obj.newPrint = higher_order_function(obj.print);

现在我可以调用obj.newPrint了,在下面,this将被用来调用print,一切都按预期进行。

对于这类事情,有其他的设计,包括显式地传递上下文(this),并将它们作为单独的参数传递给函数,但上面的方法通常更简洁,而且“直接工作”。

这就是_.throttle的工作原理。如果你看一下源代码,你会发现它做了这样的事情

代码语言:javascript
复制
return function() {
  ...
  context = this;
  args = arguments;
  ...
  result = func.apply(context, args);
};

这意味着,要以有节流的方式调用代码,您需要做的就是安排使用this来调用它。

让我们假设您调用的原始代码位于一个名为act的函数中。

代码语言:javascript
复制
var obj = {
  act: function(act) {
    this[act].apply(this, data);
  }
};

为了制作一个节流版本的act (在这里,我们将其直接放在对象上;您可以通过将其放在原型上来完成类似的事情,请参见下面的内容):

代码语言:javascript
复制
obj.throttledAct = _.throttle(obj.act);

然后只需调用

代码语言:javascript
复制
obj.throttledAct('act1')

如果您使用原型进行编程:

代码语言:javascript
复制
Foo.prototype.func = function(act) { this[act].apply(this, data) };

然后,您可以使用以下命令将节流版本放在原型上:

代码语言:javascript
复制
Foo.prototype.throttledFunc = _.throttle(Foo.prototype.func);

一切都会像预期的那样工作。

如果出于某种原因,您希望创建限制函数的独立版本,而不将其放入对象、原型或原型中:

代码语言:javascript
复制
var throttledFunc = _.throttled(func);

然后可以使用callapply调用它,以强制this的值

代码语言:javascript
复制
throttledFunc.call(obj, 'act1`);

但是无论哪种情况,参数'act1'是如何传递给底层函数的呢?这也是通过_.throttle实现中的代码行完成的,该行代码为

代码语言:javascript
复制
result = func.apply(context, args);

在这里,args是传递给_.throttle构造的函数的参数,apply用于将它们与this一起传递给底层函数。请注意,_.throttle本身也接受要传递给底层函数的附加参数,但这会“烧录它们”,而不是让它们在每次调用节流函数时指定。

你的尝试

代码语言:javascript
复制
_.throttle(/* different permutations of combined args */)
_.throttle.apply(/* same */)
_.throttle.apply(myArgs)(throttleArgs)
_.throttle(throttleArgs).apply(myArgs)

所有这些都有相同的问题,那就是_.throttle必须被传递一个要限制的函数,并返回一个函数,然后调用该函数以获得限制的行为。最后一个可能是最接近的,假设throttleArgs是要调节的函数,而myArgs实际上是this, myArgs

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32291004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档