function xxx(arr, num) {
let index = -1;
return () => num * arr[index = (index + 1) % arr.length];
}
const f = xxx([ 5, 6, 9 ], 2);
console.log([...Array(10)].map(f)); // [10, 12, 18, 10, 12, 18, 10, 12, 18, 10]
UPD. Вынесено из комментариев:
код до вложенной функции менять нельзя
То есть засовывать переменные в массив нечестно
Это не одно и то же - код создания массива можно разместить и после return'а.
Вот несколько вариантов, где переменные остаются на своих местах, как с массивом, так и без:
function xxx(num) {
let a = 5;
let b = 6;
let c = 9;
return () => num * ([ a, b, c ] = [ b, c, a ])[2];
// или
return () => num * (t => (a = b, b = c, c = t))(a);
// или
return function() {
return num * this[0][++this[1] % this[0].length];
}.bind([ [ a, b, c ], -1 ]);
// или
return (iter => () => num * iter.next().value)((function*() {
for (;; yield a, yield b, yield c) ;
})());
// или
return (i => () => num * (
i = -~i % 3,
i === 0 ? a :
i === 1 ? b :
c
))(-1);
}