什么's是调用具有可变参数的函数的有效方法

What's an efficient way to call a function with variable arguments?

本文关键字:参数 变参 函数 方法 有效 调用 什么      更新时间:2023-09-26

我正在开发一个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

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

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

switch看起来无疑是4和1 arg调用的赢家。