//makeProfileTimer function makeProfileTimer(){ let a = performance.now(); return function time (){ let b = performance.now() return `Время выполнения ${b - a}` } } let timer = makeProfileTimer() alert('Замеряем время работы этого alert'); alert(timer()); //makeSaver function makeSaver(parameter) { let called; let result; return function (...args) { if (called) { return result; } else { called = true; result = parameter(...args); return result; } } } 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 был только один раз`) //Final Countdown for (let i = 5 ; i >= 0; i--){ console.log(i) setTimeout(() => console.log(5 - i), i*1000) } console.log("Поехали!")