Javascript 节流阀及;去盎司函数

Javascript 节流阀及;去盎司函数,javascript,function,throttling,debouncing,Javascript,Function,Throttling,Debouncing,我对油门和去盎司功能的概念有点不确定 据我所知: 我们对某个事件发生后应该调用的函数进行去抖动。它用于拖动、键控等事件中,目的不是在触发事件时一直触发,而是在一系列事件完成时触发。通常在键入整个单词,或拖动或调整大小序列结束后 我们限制一个应该在一系列事件发生时启动的函数,但是当我们想要控制它被调用的次数时。就像在拖动运动中一样,我们希望函数只在距离的每x像素处调用一次,或者只在每100ms调用一次,而不是在每次触发事件时调用。因此,在一系列事件发生时调用throttle函数,次数更少 问题:

我对油门和去盎司功能的概念有点不确定

据我所知: 我们对某个事件发生后应该调用的函数进行去抖动。它用于拖动、键控等事件中,目的不是在触发事件时一直触发,而是在一系列事件完成时触发。通常在键入整个单词,或拖动或调整大小序列结束后

我们限制一个应该在一系列事件发生时启动的函数,但是当我们想要控制它被调用的次数时。就像在拖动运动中一样,我们希望函数只在距离的每x像素处调用一次,或者只在每100ms调用一次,而不是在每次触发事件时调用。因此,在一系列事件发生时调用throttle函数,次数更少

问题:
这是对这些功能及其目的的正确认识吗?还有其他区别它们的特性吗?

是的,这是一个很好的差异概述

但是,您可能需要强调的是,这些方法实际上并没有改变调用它们的函数。它们只是创建一个新函数(具有一个标识,速率限制行为受此标识约束),该函数可以根据需要随时调用,并在内部将调用转发给取消公告或限制的函数。

简称:

节流阀设计用于在持续调用期间在特定时间间隔调用函数。 比如:window.scroll。 去抖动设计为在某一特定时间内只调用一次函数。不管它叫了多少次。 比如:点击提交按钮。 以下是一个例子:

//http://jsfiddle.net/1dr00xbn/

您可以看到差异。

正如我的TL今天指出的,值得一提的是,在lodash中这两个函数的流行实现中:

油门功能实际上只是一种特定的去盎司配置:

function throttle(func, wait, options) {
  let leading = true
  let trailing = true

  if (typeof func != 'function') {
    throw new TypeError('Expected a function')
  }
  if (isObject(options)) {
    leading = 'leading' in options ? !!options.leading : leading
    trailing = 'trailing' in options ? !!options.trailing : trailing
  }
  return debounce(func, wait, {
    'leading': leading,
    'maxWait': wait,
    'trailing': trailing
  })
}

谢谢你,伯吉。是否有一个隐含的规则/约定,即应该将函数的作用域传递给去盎司或节流函数?您所说的“作用域”是什么意思?取消公告/限制的范围被隐式传递给那些函数(但无法访问),因为它是由闭包绑定的。我的意思是,当函数最终被调用时,有一个
context
被传递到
。apply(context,arguments)
。作为惯例/规则,人们是否应该期望从去抖动功能中获得这种效果?不,这只是一个方便的参数(他们使用了
apply
),而不是节流/去抖动行为固有的。您也可以在节流/去Bounced函数上使用
.bind()
,我确信,使用ES6 arrow函数,这样的事情会少一些。但你是对的,这是一个下划线的约定,所有回调函数也会接受一个
this
context..@zzzzBov有趣的阅读。谢谢。可能的副本很短,很容易理解。