Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 30.11.2018, 18:07
Аспирант
Отправить личное сообщение для Marson Посмотреть профиль Найти все сообщения от Marson
 
Регистрация: 14.08.2018
Сообщений: 65

Напишите функцию 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());


Можете помочь понять, пожалуйста? Начало кода хоть верное?
Ответить с цитированием
  #2 (permalink)  
Старый 30.11.2018, 19:44
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

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

var saver = makeSaver(Math.random);
var value1 = saver();          
var value2 = saver();
alert(value1 === value2);
Ответить с цитированием
  #3 (permalink)  
Старый 01.12.2018, 15:10
Аспирант
Отправить личное сообщение для Marson Посмотреть профиль Найти все сообщения от Marson
 
Регистрация: 14.08.2018
Сообщений: 65

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

Последний раз редактировалось Marson, 03.12.2018 в 17:13.
Ответить с цитированием
  #4 (permalink)  
Старый 04.12.2018, 12:43
Аспирант
Отправить личное сообщение для Marson Посмотреть профиль Найти все сообщения от Marson
 
Регистрация: 14.08.2018
Сообщений: 65

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

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

var saver = makeSaver(Math.random);
value1 = saver();
value2 = saver();
Ответить с цитированием
  #5 (permalink)  
Старый 04.12.2018, 12:52
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,706

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);

Последний раз редактировалось Nexus, 04.12.2018 в 15:54.
Ответить с цитированием
  #6 (permalink)  
Старый 04.12.2018, 14:24
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,004

Сообщение от Nexus
res||(res=callable());
маловероятно, но может вернуть 0
надо сравнивать с undefined
а лучше отдельную переменную, флажок что функция была вызвана
Ответить с цитированием
  #7 (permalink)  
Старый 04.12.2018, 14:48
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 642

мои пять копеек %)
<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

Последний раз редактировалось SuperZen, 04.12.2018 в 15:18.
Ответить с цитированием
  #8 (permalink)  
Старый 04.12.2018, 14:56
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,706

Сообщение от Alexandroppolus
маловероятно, но может вернуть 0
От среды исполнения зависит?
Ответить с цитированием
  #9 (permalink)  
Старый 04.12.2018, 14:58
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

SuperZen,
если с тегами script пишите, оборачивайте в <HTML run>
Ответить с цитированием
  #10 (permalink)  
Старый 04.12.2018, 15:43
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 642

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

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

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

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Возведение в куб число и массив числовых значений используя функцию Tanya51 Общие вопросы Javascript 19 15.07.2017 21:25
передать параметры в функцию jQuery AJAX Lion_astana Общие вопросы Javascript 7 21.02.2014 17:25
Расширение для Safari. Как вызвать функцию из popover в global page? housewm Opera, Safari и др. 0 21.12.2013 06:07
Помогите подключить функцию в onclick moloko Элементы интерфейса 10 30.07.2013 08:27
checkbox включен запускаем одну функцию выключен другую Sadist_dead Элементы интерфейса 11 27.09.2011 10:46