function throttle (fn, threshold, scope) {
  threshold || threshold = 250
  var last, timer
  return function () {
    var ctx = scope || this
    var now = +new Date()
    var args = arguments
    if (last && now - last - threshold < 0) {
      // hold on it
      clearTimeout(timer)
      timer = setTimeout(function () {
        last = now
        fn.apply(ctx, args)
      }, threshold)
    } else {
      last = now
      fn.apply(ctx, args)
    }
  }
}
`</pre>

<pre>`Elm.addEventListener('click', throttle(function(event){
  // ...
}, 1000))

假设第一次执行 throttle(fn0), fn0 会立即执行, 并记录 throttle 开启的时间 last

第二次执行, 假设为 throttle(fn1), 如果距离 now 未超出时限 threshold, 则开启定时器, threshold 后执行 fn1, 并设置 last

如果在开启定时器后, threshold 时限内执行 throttle(fn2) 则用于执行 fn1 的定时器会被清空, 开启 fn2 的定时器, 并设置 last

简而言之, 执行 throttle 的时候, 如果上一次的定时器未被执行, 则会被清除, 并重新开始计时