main.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. // makeProfileTimer
  2. function makeProfileTimer() {
  3. let first = performance.now();
  4. return function () {
  5. let second = performance.now();
  6. return second - first
  7. };
  8. }
  9. var timer = makeProfileTimer();
  10. alert("Замеряем время работы этого alert");
  11. alert(`${timer()} ms`);
  12. // Final Countdown
  13. for (let i = 0; i <= 5; i++) {
  14. setTimeout(() => { i === 5 ? console.log('поехали!') : console.log(5 - i) }, i * 1000)
  15. }
  16. // makeSaver
  17. function makeSaver(data) {
  18. let hasBeenCalled = false;
  19. let cashedResult;
  20. return function (...args) {
  21. if (hasBeenCalled) {
  22. return cashedResult;
  23. }
  24. else {
  25. hasBeenCalled = true;
  26. cashedResult = data(...args);
  27. return cashedResult;
  28. }
  29. }
  30. }
  31. var saver = makeSaver(Math.random) //создает функцию-хранилище результата переданной в качестве параметра функции (Math.random
  32. // в примере). На этом этапе Math.random НЕ вызывается
  33. var value1 = saver() //saver вызывает переданную в makeSaver функцию, запоминает результат и возвращает его
  34. var value2 = saver() //saver в дальнейшем просто хранит результат функции, и более НЕ вызывает переданную
  35. //в makeSaver функцию;
  36. value1 === value2 // всегда true
  37. var saver2 = makeSaver(() => console.log('saved function called') || [null, undefined, false, '', 0, Math.random()][Math.ceil(Math.random() * 6)])
  38. var value3 = saver2()
  39. var value4 = saver2()
  40. value3 === value4 // тоже должно быть true
  41. let namePrompt = prompt.bind(window, 'Как тебя зовут?')
  42. let nameSaver = makeSaver(namePrompt)
  43. alert(`Привет! Prompt еще не было!`)
  44. alert(`Привет ${nameSaver()}. Только что запустился prompt, первый и последний раз`)
  45. alert(`Слушай, ${nameSaver()}, го пить пиво. Ведь prompt был только один раз`)
  46. // myBind
  47. let myBind = function (fn, Math, arr) {
  48. return function () {
  49. index = 0;
  50. let newArr = [...arguments];
  51. return fn.apply(Math, arr.map(i => {
  52. if (i === undefined) {
  53. let number = newArr[index]
  54. index++
  55. return number
  56. }
  57. else return i
  58. }));
  59. };
  60. };
  61. var pow5 = myBind(Math.pow, Math, [undefined, 5])
  62. // первый параметр - функция для биндинга значений по умолчанию,
  63. // второй - this для этой функции, третий - массив, в котором undefined означает
  64. // параметры, которые должны передаваться при вызове,
  65. // а другие значения являются значениями по умолчанию:
  66. var cube = myBind(Math.pow, Math, [undefined, 3]) // cube возводит число в куб
  67. pow5(2) // => 32, вызывает Math.pow(2,5), соотнесите с [undefined, 5]
  68. cube(3) // => 27
  69. var chessMin = myBind(Math.min, Math, [undefined, 4, undefined, 5, undefined, 8, undefined, 9])
  70. chessMin(-1, -5, 3, 15) // вызывает Math.min(-1, 4, -5, 5, 3, 8, 15, 9), результат -5
  71. var zeroPrompt = myBind(prompt, window, [undefined, "0"]) // аналогично, только теперь задается "0" как текст по умолчанию в prompt,
  72. // а текст приглашения пользователя задается при вызове zeroPrompt
  73. var someNumber = zeroPrompt("Введите число") // вызывает prompt("Введите число","0")
  74. myBind((...params) => params.join(''), null, [undefined, 'b', undefined, undefined, 'e', 'f'])('a', 'c', 'd') === 'abcdef'