App.js 7.3 KB

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