123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- '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'
- );
|