使用可变参数调用函数的有效方法是什么?

时间:2015-03-19 18:01:05

标签: javascript performance

我正在开发一个Javascript模块,它接受一个函数,稍后允许你调用它,与currying不同。我注意到NodeJS始终使用.apply()切换到使用switch语句,如下所示。

function applyFn(fn, args, ctx) {
    switch (args.length) {
        case 0: return fn.call(ctx); break;
        case 1: return fn.call(ctx, args[0]); break;
        case 2: return fn.call(ctx, args[0], args[1]); break;
        case 3: return fn.call(ctx, args[0], args[1], args[2]); break;
        default: return fn.apply(ctx, args);
    }
}

以上示例是否比下面的此版本更好?

function applyFn(fn, args, ctx) {
    if (4 in args) return fn.apply(ctx, args);
    if (3 in args) return fn.call(ctx, args[0], args[1], args[2], args[3]);
    if (2 in args) return fn.call(ctx, args[0], args[1], args[2]);
    if (1 in args) return fn.call(ctx, args[0], args[1]);
    if (0 in args) return fn.call(ctx, args[0]);
    return fn.call(ctx); // ಠ_ಠ
}

哪个版本有更好的性能?

编辑:以下是我使用它的方式:named-parameters.js

1 个答案:

答案 0 :(得分:0)

我意识到这是一种微观优化,但由于我的模块做了一件事,我想确保它做得很好。

我在这里制作了一个测试:http://jsperf.com/switch-vs-case-function-call

switch肯定会成为4和1个arg电话的赢家。