【问题标题】:Underscore.js wrapped callbacks efficiencyUnderscore.js 包装的回调效率
【发布时间】:2014-11-05 14:17:39
【问题描述】:

我有一个关于annotated underscore.js source code的问题:

上面写着:

返回传入回调的有效(对于当前引擎)版本的内部函数,以在其他下划线函数中重复应用。

var createCallback = function(func, context, argCount) {
    if (context === void 0) return func;
    switch (argCount == null ? 3 : argCount) {
        case 1: return function(value) {
            return func.call(context, value);
        };
        case 2: return function(value, other) {
            return func.call(context, value, other);
        };
        case 3: return function(value, index, collection) {
            return func.call(context, value, index, collection);
        };
        case 4: return function(accumulator, value, index, collection) {
            return func.call(context, accumulator, value, index, collection);
        };
    }
    return function() {
        return func.apply(context, arguments);
    };
};

明确地说,这个代码块的效率是如何达到的?

因为我看到使用包装器,创建了一层间接层,作用域链又增长了一层。

我需要了解如何达到效率,以便在我自己的 js 中应用这些技巧。

谢谢!

【问题讨论】:

  • 感谢@nikoshr 的编辑!

标签: javascript performance underscore.js


【解决方案1】:

似乎有一些参数顺序的改组,但如果后面的参数留空,有些情况实际上是等价的。我认为这种逻辑也可能使回调与浏览器优化配合得很好。例如,如果返回值是可预测的,那么结果可能是内联的,而不是每次都调用实际函数。 这是关于性能和参数的相关讨论,其中测试显示出一些很大的速度差异:

Performance penalty for undefined arguments

【讨论】:

  • 感谢 robC,感谢您的回答!
  • 您好 robC,我认为像 createCallback undescore 内部函数那样编写代码的决定是由于链接“未定义参数的性能损失”中解释的原因。尽管如此,我在jsperf.com/function-undefined-args/2 中运行了您的测试,但只看到很少或根本没有性能改进。谢谢!
  • @pelicanorojo 当然,这取决于浏览器,您可以看到 firefox 14 或 Safari 7 在结果图中显示该测试的差异。顺便说一句,您应该为有用的答案投票,并通过单击对勾来接受正确的答案。
  • 是的,但是我的声望是 11,我需要 15!
  • @pelicanorojo 啊抱歉,我认为您仍然可以标记已接受的答案,如果我错了,请纠正我。
【解决方案2】:

使用下划线迭代器函数(例如_.map_.reduce_.each)时,提供的回调提供不同的参数。例如:

_.map(list, function(value, key, list) {});

_.reduce(list, function(memo, num, list) {});

createCallback 是一个便利函数,下划线在内部使用它来定义这些迭代器函数中参数的顺序。如果我们查看_.reduce 函数,我们可以看到这一行:

iteratee = createCallback(iteratee, context, 4);

将输出:

func.call(context, accumulator, value, index, collection);

其中func 是提供给_.reduce 的迭代器函数

【讨论】:

  • 也感谢 Jivings 的回答。我会分析两者然后投票。
  • 抱歉,我在注释代码中看到了这一点。我理解代码。但是您的回答并没有说明为什么会提高效率。我不确定,但我认为编码器这样做的原因是因为发布 stackoverflow.com/questions/12662497/… 。谢谢!
猜你喜欢
  • 2012-04-26
  • 1970-01-01
  • 1970-01-01
  • 2011-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-30
  • 1970-01-01
相关资源
最近更新 更多