带参数的下划线防抖函数

91

我有一个函数,需要传入一些参数。但是使用 underscore debounce 的方法是:

var lazyLayout = _.debounce(calculateLayout, 300);

但在我的情况下,calculateLayout 需要一些参数才能运行。在这种情况下,我该如何传递它们?

更新:

示例 calculateLayout 函数:

var calculateLayout = function(a,b) {
  console.log('a is ' + a + ' and b is ' + b);
}

不太确定这一点,因为我对下划线还不是很熟悉,但如果 calculateLayout 是一个函数,则将该函数与参数一起传递到匿名函数中。或者您已经尝试过这个了? - 13ruce1337
2
嗯,debounce 函数 确实会传递所给定的参数。只需调用 lazyLayout('a', 'b') 即可。 - Bergi
@Gandalf StormCrow,也许你应该取消接受我的答案,因为它并不是最优雅的解决方案,但只要它被接受了,我就无法删除它。 - gherkins
4个回答

328
当你运行防抖版本时,中间不需要匿名函数,参数将自动传递给原始函数
  var debounceCalculate = _.debounce(calculateLayout, 300);
  debounceCalculate(a,b);

作为一个优点,您不必事先硬编码绑定参数。您可以尝试它,如果好奇,只需检查源代码

这是很好的信息。谢谢你。我很难理解为什么在这里没有声明debounceCalculate作为函数,而只是分配了防抖函数,并且仍然像函数一样运行,并且能够接受参数并知道这些参数是用于防抖函数内部的函数。为什么会这样? - snowyBunny
2
如果您检查_.debounce的源代码,您会注意到它返回的是一个函数。这就是函数式编程的威力,Js 也包含了一些 :) - Jaime Agudo

42

您应该能够将匿名函数用作第一个参数,然后在其中调用任何您喜欢的内容:

_.debounce(function(){
    calculateLayout(20, 30);
}, 300);

1
这正是我在评论中所说的。如果它能够正常工作,那就完美了。 - 13ruce1337
7
此方法会多次调用内部函数,仅对每次调用应用防抖,而不是只有一次调用,这可能不是期望的结果。此网站解释了全部内容 - Giacomo1968
1
正如@JakeGould所提到的,这只会创建3个被防抖函数,它们被分配给了空值并且不会被调用。 - Muhammad Umer
谢谢!这也适用于自定义的防抖方法。 - Matt Komarnicki

11

@Jamie的回答更好。

尽管如果您熟悉JS,最好使用Jamie的答案,但我将保留我的原始答案如下:

var calculateLayout = function(a,b) {
  console.log('a is ' + a + ' and b is ' + b);
}

var debounceCalculate = _.debounce(function(a, b){
    calculateLayout(a, b);
}, 300);

debounceCalculate(1, 2);

3
嗯... var debounceCalculate = _.debounce(calculateLayout, 300); 就足够了。 - Brad Kent
@BradKent 谢谢!由于Jaime已经回答了,我会保持它今天的状态。 - huan feng
@jacobhobson 真的不知道你为什么这样做。首先,我在 Jaime 的回答之前回答了。其次,我认为我的答案对那些不会很快想到参数可以被省略的 JS 初学者很有帮助。 - huan feng

3

因为没有人写过不需要额外使用varfunction的一行代码,所以我会自己动手:

_.debounce(calculateLayout, 300)(a, b);

防抖函数返回另一个函数,因此您可以在执行防抖函数之后立即调用它。


18
完全打败了去抖动的目的。 - Tofandel
5
这不对吗?我将确切地这样设置为事件处理程序(例如onClick),但它根本没有防抖。如果你将这个设置为事件处理程序,它将始终创建一个新的防抖函数实例 - user10706046

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接