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, то выполнится второе условие...

Nexus 04.12.2018 15:51

SuperZen, спасибо.
Что-то я затупил...

j0hnik 04.12.2018 16:09

Цитата:

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

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

верно, но мы не такие везучие чтобы увидеть 0.

Nexus 04.12.2018 16:17

j0hnik, я бы программируя на удачу не надеялся.
Если есть шанс того, что будет возвращен нуль, то это обязательно случится. А это баг.

j0hnik 04.12.2018 18:55

Nexus,
я ж не спорю, но как думаете сколько нужно времени современному компьютеру чтобы в один поток завершить такой цикл?
while(Math.random() != 0);
alert(0);

Nexus 04.12.2018 19:01

j0hnik, не знаю.

Alexandroppolus 04.12.2018 19:18

Цитата:

Сообщение от j0hnik (Сообщение 499760)
Nexus,
я ж не спорю, но как думаете сколько нужно времени современному компьютеру чтобы в один поток завершить такой цикл?
while(Math.random() != 0);
alert(0);

вообще-то, по заданию, makeSaver допускает любую функцию, а не обязательно Math.random, потому не должна предполагать какие там значения могут быть а какие нет.

например, makeSaver(() => Math.round(Math.random())) поймает ноль в 50% случаев

j0hnik 05.12.2018 00:04

конечно любую и даже такую.
fn=_=>{
	if(Math.random() > 0.5) return true;
};

Marson 07.12.2018 12:19

Уважаемые, здесь нужно подумать над замыканиями, что бы работало так как именно написано в комментариях в задании, можно только на чистом js. Главное что бы value1 и value2 работали так как написано в комментариях

Nexus 07.12.2018 12:23

Marson, что вас в этом коде не устраивает?
https://javascript.ru/forum/misc/760...tml#post499738


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