下划线_.delay实现

时间:2015-06-27 19:30:46

标签: javascript delay

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

另外,如果不使用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);
  };

1 个答案:

答案 0 :(得分:2)

  

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

因为setTimeout(func(args), wait);调用func。马上。在将调用结果传递给setTimeout之前。但是这确实要求稍后调用回调函数!

  

另外,如果不使用Array.prototype.slice.call,第三个如何工作?

因为apply也直接接受arguments objects,不仅仅是数组。但是,我猜你真的想知道为什么

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

的作品?因为这就是setTimeout如何处理多余的参数 1 - 它将它们传递给延迟的func调用。

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