Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Напишите функцию makeSaver (https://javascript.ru/forum/misc/76066-napishite-funkciyu-makesaver.html)

Marson 30.11.2018 18:07

Напишите функцию makeSaver
 
Напишите функцию makeSaver, которая:
var saver = makeSaver(Math.random) //создает функцию-хранилище результата переданной в качестве параметра функции (Math.random 
                                      // в примере). На этом этапе Math.random НЕ вызывается
    var value1 = saver()              //saver вызывает переданную в makeSaver функцию, запоминает результат и возвращает его
    var value2 = saver()              //saver в дальнейшем просто хранит результат функции, и более НЕ вызывает переданную 
                                      //в makeSaver функцию;
    value1 === value2                 // всегда true


Таким образом makeSaver решает две задачи:

Навсегда сохраняет результат функции. Это актуально, например, для Math.random.
Действует лениво, то есть вызывает Math.random только тогда, когда результат действительно нужен. Если же по каким-то причинам значение не понадобится, то Math.random даже не будет вызван

function makeSaver(fn){
  return function (){
    return fn;
  }
}

var saver = makeSaver(Math.random());


Можете помочь понять, пожалуйста? Начало кода хоть верное?

j0hnik 30.11.2018 19:44

makeSaver=fn=>{
	var x = fn();
	return _=> x;
};

var saver = makeSaver(Math.random);
var value1 = saver();          
var value2 = saver();
alert(value1 === value2);

Marson 01.12.2018 15:10

Спасибо, но это то, что написано в задании.

Marson 04.12.2018 12:43

Есть у кого-то ещё варианты, что бы работало как в задании написано.
Я пока вот такой код написал, но надо его дописать:

function makeSaver(x){
    var x = x();
    function save(){
      return x;
    }
    return value1 = save;
}

var saver = makeSaver(Math.random);
value1 = saver();
value2 = saver();

Nexus 04.12.2018 12:52

function makeSaver(callable) {
    let res, executed = !1;

    return function() {
        return executed ? res : (executed = !0, res = callable());
    };
};

var saver = makeSaver(Math.random);
value1 = saver();
value2 = saver();

alert(value1 === value2);

Alexandroppolus 04.12.2018 14:24

Цитата:

Сообщение от Nexus
res||(res=callable());

маловероятно, но может вернуть 0
надо сравнивать с undefined
а лучше отдельную переменную, флажок что функция была вызвана

SuperZen 04.12.2018 14:48

мои пять копеек %)
<script>
  const saver = foo => {
    let seed = null
    return {
      gen: function () {
        seed = foo()
        return this
      },
      get value() {
        return seed
      }
    }
  }
  const maker = saver(Math.random).gen()
  console.log(maker.value)
  console.log(maker.value)
  maker.gen()
  console.log(maker.value)
</script>


возможно, ТС имеет ввиду Singleton
https://www.dofactory.com/javascript...design-pattern
https://medium.com/@frontman/%D1%80%...s-20d64da9d44b

Nexus 04.12.2018 14:56

Цитата:

Сообщение от Alexandroppolus
маловероятно, но может вернуть 0

От среды исполнения зависит?

j0hnik 04.12.2018 14:58

SuperZen,
если с тегами script пишите, оборачивайте в <HTML run>

SuperZen 04.12.2018 15:43

Nexus, взято здесь

https://developer.mozilla.org/ru/doc...ts/Math/random

Метод Math.random() возвращает псевдослучайное число с плавающей запятой из диапазона [0, 1), то есть, от 0 (включительно) до 1 (но не включая 1

ну и соответственно при res||(res=callable());
если res будет 0, то выполнится второе условие...


Часовой пояс GMT +3, время: 17:42.