С ES2015 мы можем немного поиграться с синтаксисом и злоупотреблять стандартными параметрами и блоками.Последние являются просто функциями без аргументов:
const applyT = thunk => thunk();
const fib = n => applyT(
(f = (x, y, n) => n === 0 ? x : f(y, x + y, n - 1)) => f(0, 1, n)
);
console.log(fib(10)); // 55
// Fibonacci sequence: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55...
Обратите внимание, что f
- это параметр с анонимной функцией (x, y, n) => n === 0 ? x : f(y, x + y, n - 1)
в качестве значения по умолчанию.Когда f
вызывается applyT
, этот вызов должен выполняться без аргументов, поэтому используется значение по умолчанию.Значением по умолчанию является функция, и, следовательно, f
является именованной функцией, которая может вызывать себя рекурсивно.