script.js 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. // makeProfileTimer
  2. // Напишите функцию makeProfileTimer, которая служит для замера времени выполнения другого кода и работает
  3. // следующим образом: Используйте performance.now()
  4. make_profile_timer: {
  5. function makeProfileTimer() {
  6. let t0 = performance.now();
  7. return function () {
  8. let t1 = performance.now();
  9. return t1 - t0;
  10. }
  11. }
  12. var timer = makeProfileTimer();
  13. alert('Замеряем время работы этого alert'); //некий код, время выполнения которого мы хотим измерить с высокой точностью
  14. alert(timer()); //alert должен вывести время в микросекундах от выполнения makeProfileTimer до момента вызова timer(),
  15. // т. е. измерить время выполнения alert
  16. }
  17. // makeSaver
  18. // Напишите функцию makeSaver, которая:
  19. //создает функцию-хранилище результата переданной в качестве параметра функции (Math.random в примере). На
  20. // этом этапе Math.random НЕ вызывается saver вызывает переданную в makeSaver функцию, запоминает результат
  21. // и возвращает его saver в дальнейшем просто хранит результат функции, и более НЕ вызывает переданную
  22. //в makeSaver функцию;
  23. make_saver: {
  24. function makeSaver(fn) {
  25. let result;
  26. let resultSaved = false;
  27. return function () {
  28. if (!resultSaved) {
  29. result = fn();
  30. resultSaved = true;
  31. }
  32. return result;
  33. }
  34. }
  35. var saver = makeSaver(Math.random);
  36. var value1 = saver();
  37. var value2 = saver();
  38. value1 === value2;
  39. var saver2 = makeSaver(() => console.log('saved function called') || [null, undefined, false, '', 0, Math.random()][Math.ceil(Math.random() * 6)]);
  40. var value3 = saver2();
  41. var value4 = saver2();
  42. value3 === value4;
  43. let namePrompt = prompt.bind(window, 'Как тебя зовут?');
  44. let nameSaver = makeSaver(namePrompt);
  45. alert(`Привет! Prompt еще не было!`);
  46. alert(`Привет ${nameSaver()}. Только что запустился prompt, первый и последний раз`);
  47. alert(`Слушай, ${nameSaver()}, го пить пиво. Ведь prompt был только один раз`);
  48. }
  49. // myBind
  50. // Изучите встроенную функцию bind, и сделайте свою версию, которая позволит определить "значение по умолчанию"
  51. // не только для первых параметров, но для любых других, например для степени в Math.pow:
  52. // Массив, который идет третьим параметром определяет, какие поля должны подменяться значением по умолчанию, а
  53. // какие - задаваться в последствии (undefined).
  54. my_bind: {
  55. function myBind(fn, context, defaultParams) {
  56. return function (...enteredParams) {
  57. let params = [...defaultParams];
  58. for (let i = 0; i < defaultParams.length; i++) {
  59. if (defaultParams[i] === undefined) {
  60. params[i] = enteredParams.shift();
  61. }
  62. };
  63. return fn.bind(context)(...params);
  64. }
  65. }
  66. var pow5 = myBind(Math.pow, Math, [, 5]);
  67. var cube = myBind(Math.pow, Math, [, 3]);
  68. console.log(pow5(2));
  69. console.log(cube(3));
  70. var chessMin = myBind(Math.min, Math, [, 4, , 5, , 8, , 9]);
  71. console.log(chessMin(-1, -5, 3, 15));
  72. var zeroPrompt = myBind(prompt, window, [undefined, "0"]);
  73. var someNumber = zeroPrompt("Введите число");
  74. console.log(someNumber);
  75. const bindedJoiner = myBind((...params) => params.join(''), null, [, 'b', , , 'e', 'f']);
  76. console.log(bindedJoiner('a', 'c', 'd') === 'abcdef');
  77. console.log(bindedJoiner('1', '2', '3') === '1b23ef');
  78. }
  79. // checkResult
  80. // Напишите декоратор checkResult, который:
  81. // принимает функцию для запуска и проверки результата (оригинал)
  82. // принимает функцию для проверки результата (валидатор)
  83. // возвращает обертку, которая запускает оригинал до тех пор, пока оригинал не вернет значение, удовлетворяющее
  84. // функции-валидатору. В валидатор передается результат оригинальной функции. Если валидатор возвращает true,
  85. // то обертка возвращает результат оригинальной функции. Если валидатор возвращает что-то другое, то оригинал
  86. // запускается еще, пока валидатор не вернет true.
  87. // Используя checkResult сделайте функции, которые:
  88. // randomHigh. Возвращает случайное число в диапазоне от 0.5 до 1
  89. // alwaysSayYes. Достает пользователя окном confirm пока он не согласится (не нажмет OK)
  90. // respectMe. Достает пользователя запуском этой фунцкии, пока какое-то из полей не введено
  91. check_result: {
  92. function checkResult(original, validator) {
  93. function wrapper(...params) {
  94. let result;
  95. do {
  96. result = original.apply(this, params);
  97. } while (!validator(result));
  98. return result;
  99. }
  100. return wrapper;
  101. }
  102. const numberPrompt = checkResult(prompt, x => !isNaN(+x));
  103. let number = +numberPrompt("Введите число", "0");
  104. console.log(number);
  105. const gamePrompt = checkResult(prompt, x => ['камень', 'ножницы', 'бумага'].includes(x.toLowerCase()));
  106. const turn = gamePrompt("Введите что то из списка: 'камень', 'ножницы', 'бумага'");
  107. console.log(turn);
  108. const randomHigh = checkResult(Math.random, x => x >= 0.5 && x <= 1 ? true : false)
  109. const alwaysSayYes = checkResult(confirm, x => x)
  110. }