index.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. // ДЗ: Замыкания
  2. // задание 1 makeProfileTimer
  3. {
  4. function makeProfileTimer() {
  5. const startTime = performance.now();
  6. return function () {
  7. return performance.now() - startTime;
  8. };
  9. }
  10. }
  11. {
  12. // использование функции
  13. var timer = makeProfileTimer();
  14. alert('Замеряем время работы этого alert');
  15. alert(timer() + ' микросекунд');
  16. }
  17. // задание 2 makeSaver
  18. {
  19. function makeSaver(func) {
  20. let savedValue;
  21. let hasSavedValue = false;
  22. return function () {
  23. if (!hasSavedValue) {
  24. savedValue = func();
  25. hasSavedValue = true;
  26. }
  27. return savedValue;
  28. };
  29. }
  30. }
  31. // задание 3 моя привязка
  32. {
  33. function myBind(func, thisArg, defaultArgs) {
  34. return function (...args) {
  35. let finalArgs = [];
  36. for (let i = 0; i < defaultArgs.length; i++) {
  37. if (defaultArgs[i] === undefined) {
  38. finalArgs.push(args[0]);
  39. args.shift();
  40. } else {
  41. finalArgs.push(defaultArgs[i]);
  42. }
  43. }
  44. finalArgs = [...finalArgs, ...args];
  45. return func.apply(thisArg, finalArgs);
  46. };
  47. }
  48. }
  49. // задание 4 проверить результат
  50. {
  51. function checkResult(original, validator) {
  52. return function (...params) {
  53. let result = original(...params);
  54. while (!validator(result)) {
  55. result = original(...params);
  56. }
  57. return result;
  58. };
  59. }
  60. }
  61. {
  62. const randomHigh = checkResult(Math.random, (x) => x >= 0.5 && x <= 1);
  63. const alwaysSayYes = checkResult(confirm, (x) => x === true);
  64. const respectMe = checkResult(
  65. () => {
  66. const name = prompt('Как Вас зовут?', '');
  67. const age = prompt('Сколько Вам лет?', '');
  68. const profession = prompt('Кем Вы работаете?', '');
  69. return { name, age, profession };
  70. },
  71. (x) => x.name && x.age && x.profession,
  72. );
  73. }