有没有可能对this[act].apply(this, data)这样的东西进行速率限制、节流或去抖动?带下划线或其他什么?我试过很多东西,比如
_.throttle(/* different permutations of combined args */)
_.throttle.apply(/* same */)
_.throttle.apply(myArgs)(throttleArgs)
_.throttle(throttleArgs).apply(myArgs)
有些会产生错误,有些会冻结执行,有些会调用apply方法(正确的作用域和参数,但没有节流)。有什么想法吗?使用CoffeeScript,这些都是类方法。
发布于 2015-08-30 13:20:44
由于您正在调用的原始函数
this[act].apply(this, data)使用this,我假设您是从对象的方法中调用它的。问题是,如何让this从这里到那里?许多高阶函数被设计为使用与调用它们本身相同的this调用底层函数,使用以下类型的框架:
function higher_order_function(fn) {
return function() {
return fn.apply(this, arguments);
};
}这意味着,如果我有一个带有方法的对象
var obj = {
val: 42,
print: function() { console.log(this.val); }
}然后我想转换一下print函数:
obj.newPrint = higher_order_function(obj.print);现在我可以调用obj.newPrint了,在下面,this将被用来调用print,一切都按预期进行。
对于这类事情,有其他的设计,包括显式地传递上下文(this),并将它们作为单独的参数传递给函数,但上面的方法通常更简洁,而且“直接工作”。
这就是_.throttle的工作原理。如果你看一下源代码,你会发现它做了这样的事情
return function() {
...
context = this;
args = arguments;
...
result = func.apply(context, args);
};这意味着,要以有节流的方式调用代码,您需要做的就是安排使用this来调用它。
让我们假设您调用的原始代码位于一个名为act的函数中。
var obj = {
act: function(act) {
this[act].apply(this, data);
}
};为了制作一个节流版本的act (在这里,我们将其直接放在对象上;您可以通过将其放在原型上来完成类似的事情,请参见下面的内容):
obj.throttledAct = _.throttle(obj.act);然后只需调用
obj.throttledAct('act1')如果您使用原型进行编程:
Foo.prototype.func = function(act) { this[act].apply(this, data) };然后,您可以使用以下命令将节流版本放在原型上:
Foo.prototype.throttledFunc = _.throttle(Foo.prototype.func);一切都会像预期的那样工作。
如果出于某种原因,您希望创建限制函数的独立版本,而不将其放入对象、原型或原型中:
var throttledFunc = _.throttled(func);然后可以使用call或apply调用它,以强制this的值
throttledFunc.call(obj, 'act1`);但是无论哪种情况,参数'act1'是如何传递给底层函数的呢?这也是通过_.throttle实现中的代码行完成的,该行代码为
result = func.apply(context, args);在这里,args是传递给_.throttle构造的函数的参数,apply用于将它们与this一起传递给底层函数。请注意,_.throttle本身也接受要传递给底层函数的附加参数,但这会“烧录它们”,而不是让它们在每次调用节流函数时指定。
你的尝试
_.throttle(/* different permutations of combined args */)
_.throttle.apply(/* same */)
_.throttle.apply(myArgs)(throttleArgs)
_.throttle(throttleArgs).apply(myArgs)所有这些都有相同的问题,那就是_.throttle必须被传递一个要限制的函数,并返回一个函数,然后调用该函数以获得限制的行为。最后一个可能是最接近的,假设throttleArgs是要调节的函数,而myArgs实际上是this, myArgs。
https://stackoverflow.com/questions/32291004
复制相似问题