hw.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. 'use strict';
  2. //Замыкания
  3. //makeProfileTimer
  4. //Напишите функцию makeProfileTimer, которая служит для замера времени выполнения другого кода и работает следующим образом:
  5. //Используйте performance.now()
  6. // const makeProfileTimer = () => () => performance.now();
  7. // const timer = makeProfileTimer();
  8. // alert('Замеряем время работы этого alert'); //некий код, время выполнения которого мы хотим измерить с высокой точностью
  9. // alert(timer()); //alert должен вывести время в микросекундах от выполнения makeProfileTimer до момента вызова timer(),
  10. // т. е. измерить время выполнения alert
  11. //makeSaver
  12. //Напишите функцию makeSaver, которая:
  13. // const makeSaver = (fn) => () => fn;
  14. // const saver = makeSaver(Math.random);
  15. // const value1 = saver();
  16. // const value2 = saver();
  17. // console.log(value1 === value2);
  18. // const saver2 = makeSaver(
  19. // () =>
  20. // console.log('saved function called') ||
  21. // [null, undefined, false, '', 0, Math.random()][Math.ceil(Math.random() * 6)]
  22. // );
  23. // const value3 = saver2();
  24. // const value4 = saver2();
  25. // console.log(value3 === value4); // тоже должно быть true
  26. // const namePrompt = prompt.bind(window, 'Как тебя зовут?');
  27. // const nameSaver = makeSaver(namePrompt);
  28. // alert(`Привет! Prompt еще не было!`);
  29. // alert(
  30. // `Привет ${nameSaver()}. Только что запустился prompt, первый и последний раз`
  31. // );
  32. // alert(`Слушай, ${nameSaver()}, го пить пиво. Ведь prompt был только один раз`);
  33. //Final Countdown
  34. //Напишите код, который будет делать обратный ежесекундный отсчёт в консоли, используя console.log.
  35. //Используйте Self Invoked Function для создания замыкания и setTimeout для задержки вывода.Результатом должно быть:
  36. // 5 //пауза 1 секунда
  37. 4; //пауза 1 секунда
  38. 3; //пауза 1 секунда
  39. 2; //пауза 1 секунда
  40. 1; //пауза 1 секунда
  41. // ('поехали!');
  42. // (function selfCountDown(n) {
  43. // if (n === 0) return;
  44. // setTimeout(() => {
  45. // console.log(n);
  46. // selfCountDown(n - 1);
  47. // }, 1000);
  48. // })(5);
  49. //myBind
  50. //Изучите встроенную функцию bind, и сделайте свою версию, которая позволит определить "значение по умолчанию"
  51. //не только для первых параметров, но для любых других, например для степени в Math.pow:
  52. //Массив, который идет третьим параметром определяет, какие поля должны подменяться значением по умолчанию,
  53. //а какие - задаваться в последствии(undefined).
  54. const myBind = function (fnBind, context, settings) {
  55. return function (...params) {
  56. let i = 0;
  57. const array = settings.map((settingsItem) => {
  58. if (settingsItem === undefined) {
  59. const paramsItem = params[i];
  60. i += 1;
  61. return paramsItem;
  62. } else {
  63. return settingsItem;
  64. }
  65. });
  66. return fnBind(...array);
  67. };
  68. };
  69. const pow5 = myBind(Math.pow, Math, [undefined, 5]);
  70. const cube = myBind(Math.pow, Math, [undefined, 3]);
  71. console.log(pow5(2)); // => 32, вызывает Math.pow(2,5), соотнесите с [undefined, 5]
  72. console.log(cube(3)); // => 27
  73. // первый параметр - функция для биндинга значений по умолчанию,
  74. // второй - this для этой функции, третий - массив, в котором undefined означает
  75. // параметры, которые должны передаваться при вызове,
  76. // а другие значения являются значениями по умолчанию:
  77. // cube возводит число в куб
  78. const chessMin = myBind(Math.min, Math, [
  79. undefined,
  80. 4,
  81. undefined,
  82. 5,
  83. undefined,
  84. 8,
  85. undefined,
  86. 9,
  87. ]);
  88. // chessMin(-1, -5, 3, 15); // вызывает Math.min(-1, 4, -5, 5, 3, 8, 15, 9), результат -5
  89. console.log(chessMin(-1, -5, 3, 15));
  90. const zeroPrompt = myBind(prompt, window, [undefined, '0']);
  91. // аналогично, только теперь задается "0" как текст по умолчанию в prompt,
  92. // // а текст приглашения пользователя задается при вызове zeroPrompt
  93. const someNumber = zeroPrompt('Введите число'); // вызывает prompt("Введите число","0")
  94. console.log(
  95. myBind((...params) => params.join(''), null, [
  96. undefined,
  97. 'b',
  98. undefined,
  99. undefined,
  100. 'e',
  101. 'f',
  102. ])('a', 'c', 'd') === 'abcdef'
  103. );