123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- // 1. makeProfileTimer
- // Напишите функцию makeProfileTimer, которая служит для замера времени выполнения другого кода и работает следующим образом:
- // {
- // function makeProfileTimer () {
- // let t0 = performance.now();
- // return function () {
- // let t1 = performance.now();
- // return `Время работы этого alert ${t1-t0}`
- // }
- // }
- //
- // let timer = makeProfileTimer()
- // alert('Замеряем время работы этого alert');
- // alert(timer())
- // }
- //2. makeSaver
- // Напишите функцию makeSaver, которая:
- //Таким образом makeSaver решает две задачи:
- //
- // Навсегда сохраняет результат функции. Это актуально, например, для Math.random.
- // Действует лениво, то есть вызывает Math.random только тогда, когда результат действительно нужен. Если же по
- // каким-то причинам значение не понадобится, то Math.random даже не будет вызван
- //
- // function makeSaver(fn) {
- // let result;
- // let resultSave = false;
- // return function () {
- // if (!resultSave) {
- // result = fn();
- // resultSave = true;
- // }
- // return result;
- // }
- // }
- //
- // var saver = makeSaver(Math.random);
- // var value1 = saver();
- // var value2 = saver();
- // value1 === value2;
- //
- // 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;
- //
- // 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) {
- let result;
- do {
- result = original.apply(this, params);
- } while (!validator(result));
- return result;
- }
- return wrapper;
- }
- //numberPrompt - это функция, которая будет запускать prompt до тех пор, пока пользователь не введет число
- const numberPrompt = checkResult(prompt, x => !isNaN(+x))
- let number = +numberPrompt("Введите число", "0") //параметры передаются насквозь в оригинал. Не забудьте передать this, используя call или apply
- console.log(number);
- //gamePrompt - это функция, которая будет запускать prompt до тех пор, пока пользователь не введет одно из слов 'камень', 'ножницы', 'бумага'
- const gamePrompt = checkResult(prompt, x => ['камень', 'ножницы', 'бумага'].includes(x.toLowerCase()))
- const turn = gamePrompt("Введите что то из списка: 'камень', 'ножницы', 'бумага'")
- console.log(turn);
- // Используя checkResult сделайте функции, которые:
- // randomHigh. Возвращает случайное число в диапазоне от 0.5 до 1*
- const randomHigh = checkResult(Math.random, x => x >= 0.5 && x <=1 ? true : false )
- console.log(randomHigh())
- //alwaysSayYes. Достает пользователя окном confirm пока он не согласится (не нажмет OK)
- const alwaysSayYes = checkResult(confirm, x => x)
- alwaysSayYes()
|