<header>make Saver</header>

<body>
    <script>
        const makeSaver = (func) => {
            let valueSet = false;
            let savedValue = null;
            const saver = () => {
                if (!valueSet) {
                    savedValue = func();
                    valueSet = true;
                }
                return savedValue;
            }
            return saver;
        }


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

        var saver2 = makeSaver(() => console.log('saved function called') || [null, undefined, false, '', 0, Math.random()][Math.ceil(Math.random() * 6)])
        var value3 = saver2()
        var value4 = saver2()

        value3 === value4 // тоже должно быть true



        let namePrompt = prompt.bind(window, 'Как тебя зовут?')
        let nameSaver = makeSaver(namePrompt)
        alert(`Привет! Prompt еще не было!`)
        alert(`Привет ${nameSaver()}. Только что запустился prompt, первый и последний раз`)
        alert(`Слушай, ${nameSaver()}, го пить пиво. Ведь prompt был только один раз`)
    </script>
</body>