Первый метод является более общим и, как следствие, более полезным. Рассмотрим ситуацию, в которой вы хотите вызывать некоторые функции по конвейеру для нескольких входов, а не только для одного:
const pipe = (x, ...fns) => fns.reduce((v, f) => f(v), x);
console.log(
pipe(1, x => x + 2, x => x * 2),
pipe(3, x => x + 2, x => x * 2),
);
Это ужасно. Функция более высокого порядка позволяет писать менее повторяющийся код:
const pipe = (...fns) => x => fns.reduce((v, f) => f(v), x);
const changeNum = pipe(x => x + 2, x => x * 2);
console.log(
changeNum(1),
changeNum(3),
);
Если вы находитесь в ситуации, когда вам не нужно вызывать переданную по трубопроводу функцию более одного раза, у вас не так много конкретных преимуществ. метод по сравнению с другим (за исключением, возможно, для типизации аргументов - наличие одинаковых аргументов, таких как ...fns
, может считаться более элегантным, чем смешивание аргументов, которые обозначают принципиально разные вещи, такие как (x, ...fns)
).
Тем не менее, легче не думать о том, в какой ситуации вы находитесь, и в этом случае стандартная функция pipe
для (...fns) => x =>
в любом случае предпочтительнее, поскольку она будет достаточно гибкой для всех ситуаций. в отличие от альтернативы.