// 1. makeProfileTimer + // Напишите функцию makeProfileTimer, которая служит для замера времени выполнения другого кода и работает следующим образом: // { // let time = performance.now(); // alert('Замеряем время работы этого alert'); // time = performance.now() - time; // alert(`Время выполнения ${time}`) // } // { // function makeProfileTimer () { // let t0 = performance.now(); // alert('Замеряем время работы этого alert'); // let t1 = performance.now(); // return function () { // return `Время работы этого alert ${t1-t0}` // } // } // // let timer = makeProfileTimer() // alert(timer()) // } //2. makeSaver // Напишите функцию makeSaver, которая: //Таким образом makeSaver решает две задачи: // // Навсегда сохраняет результат функции. Это актуально, например, для Math.random. // Действует лениво, то есть вызывает Math.random только тогда, когда результат действительно нужен. Если же по // каким-то причинам значение не понадобится, то Math.random даже не будет вызван // function makeSaver (fn) { // return function bind () { // return fn; // } // } //let saver = makeSaver(Math.random) // let value1 = saver(); // let value2 = saver(); // console.log(value1()) // console.log(value2()) // console.log(value1 === value2) // ---------------------------------------------------- // let saver2 = makeSaver(() => console.log('saved function called') || [null, undefined, false, '', 0, Math.random()][Math.ceil(Math.random()*6)]) // let value3 = saver2(); // let value4 = saver2(); // console.log(value3()) // console.log(value4()) // console.log(value3 === value4) // ------------------------------------------------------------ function makeSaver () { return function bind() { return name; } } let namePrompt = prompt.bind(window, 'Как тебя зовут?'); let nameSaver = makeSaver(namePrompt) alert(`Привет! Prompt еще не было!`) alert(`Привет ${nameSaver()}. Только что запустился prompt, первый и последний раз`) alert(`Слушай, ${nameSaver()}, го пить пиво. Ведь prompt был только один раз`) //3. myBind + // Изучите встроенную функцию bind, и сделайте свою версию, которая позволит определить "значение по умолчанию" не // только для первых параметров, но для любых других, например для степени в Math.pow: // { // function myBind (func, place, parametr) { // function wrapper () { // let args = Object.assign(parametr, arguments); // return func.apply(place, args); // } // return wrapper; // } // // let pow5 = myBind(Math.pow, Math, [, 5]) // console.log(pow5(2)) // // let cube = myBind(Math.pow, Math, [, 3]); // console.log(cube(3)) // // let zeroPrompt = myBind(prompt, window, [undefined, '0']) // let someNumber = zeroPrompt("Введите число"); // alert(someNumber) // // let chessMin = myBind(Math.min, Math, [ 4, 5, 8, 9]); // console.log(chessMin(-1,-10,3,15)) // // const bindedJoiner = myBind((...params) => params.join(''), null, [ ,'b', , ,'e','f']) // console.log(bindedJoiner('a','c','d')) //} //4. checkResult // Напишите декоратор checkResult, который: // // принимает функцию для запуска и проверки результата (оригинал) // принимает функцию для проверки результата (валидатор) // возвращает обертку, которая запускает оригинал до тех пор, пока оригинал не вернет значение, удовлетворяющее // функции-валидатору. В валидатор передается результат оригинальной функции. Если валидатор возвращает true, то // обертка возвращает результат оригинальной функции. Если валидатор возвращает что-то другое, то оригинал // запускается еще, пока валидатор не вернет true. // function checkResult (original, validator) { // function wrapper(...params){ // // } // return wrapper // } // // // //numberPrompt - это функция, которая будет запускать prompt до тех пор, пока пользователь не введет число // const numberPrompt = checkResult(prompt, x => !isNaN(+x)) // let number = +numberPrompt("Введите число", "0") //параметры передаются насквозь в оригинал. Не забудьте передать this, используя call или apply // // //gamePrompt - это функция, которая будет запускать prompt до тех пор, пока пользователь не введет одно из слов 'камень', 'ножницы', 'бумага' // const gamePrompt = checkResult(prompt, x => ['камень', 'ножницы', 'бумага'].includes(x.toLowerCase())) // const turn = gamePrompt("Введите что то из списка: 'камень', 'ножницы', 'бумага'") //