script.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. /* //Closures and scopes
  2. Замыкания
  3. Напишите функцию makeProfileTimer, которая служит для замера времени выполнения другого кода и работает следующим образом:
  4. var timer = makeProfileTimer()
  5. alert('Замеряем время работы этого alert'); //некий код, время выполнения которого мы хотим измерить с высокой точностью
  6. alert(timer()); //alert должен вывести время в микросекундах от выполнения makeProfileTimer до момента вызова timer(),
  7. // т. е. измерить время выполнения alert
  8. Используйте performance.now() */
  9. function makeProfileTimer() {
  10. let t0 = performance.now();
  11. return function tn() {
  12. let t1 = performance.now();
  13. return ("Call took " + (t1 - t0) + " milliseconds.")
  14. }
  15. }
  16. let timer = makeProfileTimer();
  17. //alert('Замеряем время работы этого alert');
  18. //alert(timer());
  19. let timer2 = makeProfileTimer();
  20. //confirm();
  21. //confirm(timer2());
  22. let timer3 = makeProfileTimer();
  23. //console.log('timer3')
  24. //console.log(timer3());
  25. // makeSaver
  26. function makeSaver(func) {
  27. let funcRes = func();
  28. function saverFunc() {
  29. return funcRes;
  30. }
  31. return saverFunc;
  32. }
  33. let saver = makeSaver(Math.random)
  34. //console.log(saver());
  35. //console.log(saver());
  36. //console.log(saver());
  37. var value1 = saver() //saver вызывает переданную в makeSaver функцию, запоминает результат и возвращает его
  38. var value2 = saver() //saver в дальнейшем просто хранит результат функции, и более НЕ вызывает переданную
  39. //в makeSaver функцию;777
  40. //console.log(value1 === value2); // всегда true
  41. /* let namePrompt = prompt.bind(window, 'Как тебя зовут?')
  42. let nameSaver = makeSaver(namePrompt)
  43. alert(`Привет! Prompt еще не было!`)
  44. alert(`Привет ${nameSaver()}. Только что запустился prompt, первый и последний раз`)
  45. alert(`Слушай, ${nameSaver()}, го пить пиво. Ведь prompt был только один раз`) */
  46. /* Final Countdown
  47. Напишите код, который будет делать обратный ежесекундный отсчёт в консоли, \
  48. используя console.log.
  49. Используйте Self Invoked Function для создания замыкания и setTimeout для задержки вывода.
  50. Результатом должно быть:
  51. 5 //пауза 1 секунда
  52. 4 //пауза 1 секунда
  53. 3 //пауза 1 секунда
  54. 2 //пауза 1 секунда
  55. 1 //пауза 1 секунда
  56. "поехали!" */
  57. let counter = 5;
  58. function countdown() {
  59. console.log(counter);
  60. let int1 = setTimeout(() => {
  61. countdown()
  62. }, 1000);
  63. if (counter > 0) {
  64. return (function decr() {
  65. return counter--;
  66. })();
  67. }
  68. clearTimeout(int1)
  69. if (counter === 0) {
  70. console.log('GOGOGO');
  71. }
  72. };
  73. //countdown();
  74. /*
  75. //))cheeter
  76. let counter = 5;
  77. function countdown() {
  78. console.log(counter);
  79. if (counter > 0) {
  80. return (function decr(){
  81. return counter--;
  82. })();
  83. }
  84. else if (counter===0){
  85. counter = 'GOGOGO';
  86. } else clearInterval(int1);
  87. };
  88. let int1 = setInterval(() => {countdown()}, 1000); */
  89. //myBind
  90. /* let pow5 = myBind(Math.pow, Math, [undefined, 5]) // первый параметр - функция для биндинга значений по умолчанию,
  91. // второй - this для этой функции, третий - массив, в котором undefined означает
  92. // параметры, которые должны передаваться при вызове,
  93. // а другие значения являются значениями по умолчанию:
  94. let cube = myBind(Math.pow, Math, [undefined, 3]) // cube возводит число в куб
  95. pow5(2) // => 32, вызывает Math.pow(2,5), соотнесите с [undefined, 5]
  96. cube(3) // => 27
  97. let chessMin = myBind(Math.min, Math, [undefined, 4, undefined, 5,undefined, 8,undefined, 9])
  98. chessMin(-1,-5,3,15) // вызывает Math.min(-1, 4, -5, 5, 3, 8, 15, 9), результат -5
  99. let zeroPrompt = myBind(prompt, window, [undefined, "0"]) // аналогично, только теперь задается "0" как текст по умолчанию в prompt,
  100. // а текст приглашения пользователя задается при вызове zeroPrompt
  101. let someNumber = zeroPrompt("Введите число") // вызывает prompt("Введите число","0")
  102. myBind((...params) => params.join(''), null, [undefined, 'b', undefined, undefined, 'e', 'f'])('a','c','d') === 'abcdef' */
  103. function myBind(func, funcThis, arr) {
  104. let funcRes = func.bind(...arr);
  105. console.log(arr);
  106. function retFunc(...params) {
  107. console.log(arr);
  108. console.log(params);
  109. return funcRes(...params);
  110. }
  111. return retFunc;
  112. }
  113. console.log(myBind(Math.pow, Math, [undefined, 5]));
  114. console.log(myBind((...params) => params.join(''), null, [undefined, 'b', undefined, undefined, 'e', 'f'])('a', 'c', 'd'));