js.js 6.1 KB

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