function makeProfileTimer() { let time1 = performance.now() let timeInner = () => { let time2 = performance.now() return time2 - time1 } return timeInner; } // var timer = makeProfileTimer() // alert('Замеряем время работы этого alert'); //некий код, время выполнения которого мы хотим измерить с высокой точностью // alert(timer()); //alert должен вывести время в микросекундах от выполнения makeProfileTimer до момента вызова timer(), // // т. е. измерить время выполнения alert function makeSaver(funk) { let savedResult = funk() let result = () => { return savedResult } 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 function starter (number) { setTimeout(() => { if(number > 0){ console.log(number) number = number-1 return starter(number) } else { return console.log("done") } }, 1000) } //starter(5)