'use strict'; //Замыкания //makeProfileTimer //Напишите функцию makeProfileTimer, которая служит для замера времени выполнения другого кода и работает следующим образом: //Используйте performance.now() // const makeProfileTimer = () => () => performance.now(); // const timer = makeProfileTimer(); // alert('Замеряем время работы этого alert'); //некий код, время выполнения которого мы хотим измерить с высокой точностью // alert(timer()); //alert должен вывести время в микросекундах от выполнения makeProfileTimer до момента вызова timer(), // т. е. измерить время выполнения alert //makeSaver //Напишите функцию makeSaver, которая: // const makeSaver = (fn) => () => fn; // const saver = makeSaver(Math.random); // const value1 = saver(); // const value2 = saver(); // console.log(value1 === value2); // const saver2 = makeSaver( // () => // console.log('saved function called') || // [null, undefined, false, '', 0, Math.random()][Math.ceil(Math.random() * 6)] // ); // const value3 = saver2(); // const value4 = saver2(); // console.log(value3 === value4); // тоже должно быть true // const namePrompt = prompt.bind(window, 'Как тебя зовут?'); // const nameSaver = makeSaver(namePrompt); // alert(`Привет! Prompt еще не было!`); // alert( // `Привет ${nameSaver()}. Только что запустился prompt, первый и последний раз` // ); // alert(`Слушай, ${nameSaver()}, го пить пиво. Ведь prompt был только один раз`); //Final Countdown //Напишите код, который будет делать обратный ежесекундный отсчёт в консоли, используя console.log. //Используйте Self Invoked Function для создания замыкания и setTimeout для задержки вывода.Результатом должно быть: // 5 //пауза 1 секунда 4; //пауза 1 секунда 3; //пауза 1 секунда 2; //пауза 1 секунда 1; //пауза 1 секунда // ('поехали!'); // (function selfCountDown(n) { // if (n === 0) return; // setTimeout(() => { // console.log(n); // selfCountDown(n - 1); // }, 1000); // })(5); //myBind //Изучите встроенную функцию bind, и сделайте свою версию, которая позволит определить "значение по умолчанию" //не только для первых параметров, но для любых других, например для степени в Math.pow: //Массив, который идет третьим параметром определяет, какие поля должны подменяться значением по умолчанию, //а какие - задаваться в последствии(undefined). const myBind = function (fnBind, context, settings) { return function (...params) { let i = 0; const array = settings.map((settingsItem) => { if (settingsItem === undefined) { const paramsItem = params[i]; i += 1; return paramsItem; } else { return settingsItem; } }); return fnBind(...array); }; }; const pow5 = myBind(Math.pow, Math, [undefined, 5]); const cube = myBind(Math.pow, Math, [undefined, 3]); console.log(pow5(2)); // => 32, вызывает Math.pow(2,5), соотнесите с [undefined, 5] console.log(cube(3)); // => 27 // первый параметр - функция для биндинга значений по умолчанию, // второй - this для этой функции, третий - массив, в котором undefined означает // параметры, которые должны передаваться при вызове, // а другие значения являются значениями по умолчанию: // cube возводит число в куб const chessMin = myBind(Math.min, Math, [ undefined, 4, undefined, 5, undefined, 8, undefined, 9, ]); // chessMin(-1, -5, 3, 15); // вызывает Math.min(-1, 4, -5, 5, 3, 8, 15, 9), результат -5 console.log(chessMin(-1, -5, 3, 15)); const zeroPrompt = myBind(prompt, window, [undefined, '0']); // аналогично, только теперь задается "0" как текст по умолчанию в prompt, // // а текст приглашения пользователя задается при вызове zeroPrompt const someNumber = zeroPrompt('Введите число'); // вызывает prompt("Введите число","0") console.log( myBind((...params) => params.join(''), null, [ undefined, 'b', undefined, undefined, 'e', 'f', ])('a', 'c', 'd') === 'abcdef' );