17

这是 Underscore.jsdelay函数的源代码:

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

这与 有什么不同setTimeout?为什么 Underscore.js 需要delay

4

4 回答 4

24

这是一种跨浏览器的方式,能够传递额外的参数,这些参数将作为回调的参数出现,例如setTimeout(). 这在 IE 中不起作用。

它可以让你的代码更漂亮...

setTimeout(_.bind(function() { }, null, "arg1"), 1e3);

……对……

_.delay(function() { }, 1e3, "arg1");

我同意这是Naomi 的回答中概述的不太有用的 Underscore 方法之一。

于 2013-06-03T04:58:42.940 回答
17

为什么 Underscore.js 有延迟功能?

因为笨。这个特殊的 underscore.js 方法看起来很愚蠢。

缺点

  1. lib 中的附加功能意味着更大的代码库
  2. 更大的代码库意味着更多的维护和更多可能的错误
  3. 使用此函数的代码现在依赖于该库
  4. 对原生 API 的较小/零改进意味着低成本:增益比
  5. 学习新的api

优点

本节特意留空


我只想学习使用javascript并做类似的事情

var hello = function() {
  console.log("hello");
};

var delay = 1000;

window.setTimeout(hello, delay);

很简单,对吧?Underscore.js 有时毫无用处。老实说,window.setTimeout就其本身而言,它非常有用。


这是另一个示例,展示如何将 arg 传递给函数

var Cat = function(name) {
  function meow(message) {
    console.log(name, "says meow!", message);
  }
  this.meow = meow;
};

var duchess = new Cat("Duchess");

window.setTimeout(duchess.meow.bind(duchess, "please feed me!"), 2000);

// 2 seconds later
// => Duchess says meow! please feed me!

如果你不能依赖.bind你也可以使用闭包

window.setTimeout(function() {
  duchess.meow("please feed me!");
}, 1000);

哇,虽然这很难。我将回到下划线、lodash 和 jquery。这个 JavaScript 东西很难!

于 2013-06-03T05:32:58.107 回答
10

美学

该库的作者,他选择利用业余时间开源它,谈论它,用它作为向人们介绍 javascript 的一种方式,也许让某人在闭包范围内有一个灯泡时刻,他认为有了这个,图书馆的吸引力就增强了。

孤立地争论这个功能的相关性就像争论一幅画或其他工艺的相关性。有些人可能喜欢它,有些人可能不喜欢。

你可以自由地喜欢或不喜欢它。就个人而言,我更喜欢直截了当的库。

_.delay, _.defer, _.throttle, _.after恕我直言,它的流量比窗口好。

除此之外,通常我也喜欢编写节点服务器端(nodejs),而不必切换/进入/退出模式......尝试window.timeout在节点中使用,看看会发生什么。

于 2015-07-10T23:29:25.940 回答
4

不多,尽管它在主题上符合defer, debounce, 等等。这意味着您可以使用下划线包装符号:

_(yourfunction).delay(1000);

此外,它似乎不会让您摆脱调用 eval 的字符串参数。

于 2013-06-03T05:05:28.073 回答