我正在开发一个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
答案 0 :(得分:0)
我意识到这是一种微观优化,但由于我的模块做了一件事,我想确保它做得很好。
我在这里制作了一个测试:http://jsperf.com/switch-vs-case-function-call
switch
肯定会成为4和1个arg电话的赢家。