main.js 4.4 KB

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