#javascript
Возможно ли сделать так, чтобы в консоль выводилось первое вычисленное значение.
При этом нельзя изменять переменную data, должна остаться как определено ниже.
function getInc(inc) {
// решение
}
let data = getInc( (i) => { return ++i } )
console.log( data(10) ); //11
console.log( data(20) ); //11
console.log( data(30) ); //11
Ответы
Ответ 1
Нужно просто сохранить первый результат в замыкании: function getInc(inc) { const NO_CALL_FLAG = Symbol(); let res = NO_CALL_FLAG; return function(arg){ // если ещё не вычисляли, вычисляем и сохраняем в замыкании return res === NO_CALL_FLAG ? res = inc(arg) : res; }; } let data = getInc( (i) => { return ++i }) console.log( data(10) ); //11 console.log( data(20) ); //11 console.log( data(30) ); //11 // ещё пример: let twice = getInc(i => 2*i); console.log(twice(5), twice(3)); // 10 10 Если нужна поддержка функций с количеством аргументов отличных от 1, достаточно оба arg заменить на ...argsОтвет 2
Нужно сохранить параметр в замыкании что функция вызывалась. И сохранить результат первого вызова, чтобы потом всегда возвращать его. function getInc(_function) { let isFunctionCall = false; let functionResult = null; return (...args) => { if (!isFunctionCall) { isFunctionCall = true; functionResult = _function(...args); } return functionResult; } } let data = getInc((i) => { return ++i }) console.log( data(10) ); //11 console.log( data(20) ); //11 console.log( data(30) ); //11Ответ 3
function getInc(inc, val) { let i = val return () => inc(i) } let data = getInc((i) => ++i, 10) console.log(data(10)); //11 console.log(data(20)); //11 console.log(data(30)); //11 Правда я немного изменил сигнатуру getInc и первое значение надо передавать при получении data. Вариант без изменённой сигнатуры. function getInc(inc) { let i = 0 return val => i ? i : i = inc(val) } let data = getInc((i) => ++i) console.log(data(10)); //11 console.log(data(20)); //11 console.log(data(30)); //11Ответ 4
Возможно я не понял вопрос, ответ: function getInc(inc) { // решение return (j) => 11; }
Комментариев нет:
Отправить комментарий