Я работаю над модулем 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); // ಠ_ಠ
}
Какая версия имеет лучшую производительность?
EDIT: Вот как я использую его: named-parameters.js
Почему бы не 'call()' напрямую? Как насчет этих 'if' и' switch'? – DontVoteMeDown
Это похоже на микро-оптимизацию. –
Это довольно странно. Вы думаете, что V8 будет достаточно умным, чтобы сделать это сам. –