下划线 _.delay 实现

underscore _.delay implementation

为什么延迟的第一个实现不起作用?

另外,第三个如何在不使用 Array.prototype.slice.call 的情况下工作?

  _.delay = function(func, wait) {
    var args = Array.prototype.slice.call(arguments, 2);
    return setTimeout(func(args), wait);
  };

  _.delay = function(func, wait) {
    var args = Array.prototype.slice.call(arguments, 2);
    return setTimeout(function() { return func.apply(this, args); }, wait);
  };

  _.delay = function(func, wait) {
    return setTimeout.apply(this, arguments);
  };

Why does the first implementation of delay not work?

因为 setTimeout(<strong>func(args)</strong>, wait); 调用 function。现在。在将调用结果传递给 setTimeout 之前。但这确实需要稍后调用回调函数!

Also how does the 3rd one work without using Array.prototype.slice.call?

因为apply does also accept arguments objects直接,不只是数组。但是,我猜你真的想知道为什么

_.delay = function(func, wait, ...args) {
    return setTimeout(func, wait, ...args); // using rest arguments
};

有效吗?因为这就是 setTimeout 处理多余参数的方式 1 - 它将它们传递给延迟的 func 调用。

1:在大多数实现中。旧的IE没有。