script.js 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  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. function myBind(func, funcThis, arr) {
  91. return function retFunc(...params) {
  92. let count = 0;
  93. for (let el in arr) {
  94. if (arr[el] === undefined) {
  95. arr[el] = params[count];
  96. count++;
  97. }
  98. }
  99. return func.apply(funcThis, arr);
  100. }
  101. }
  102. let pow5 = myBind(Math.pow, Math, [undefined, 5])
  103. console.log(pow5(2));
  104. console.log(myBind((...params) => params.join(''), null, [undefined, 'b', undefined, undefined, 'e', 'f'])('a', 'c', 'd'));
  105. let chessMin = myBind(Math.min, Math, [undefined, 4, undefined, 5, undefined, 8, undefined, 9])
  106. console.log(chessMin(-1, -5, 3, 15)) // вызывает Math.min(-1, 4, -5, 5, 3, 8, 15, 9), результат -5
  107. //let zeroPrompt = myBind(prompt, window, [undefined, "0"]) // аналогично, только теперь задается "0" как текст по умолчанию в prompt, // а текст приглашения пользователя задается при вызове zeroPrompt
  108. //let someNumber = zeroPrompt("Введите число") // вызывает prompt("Введите число","0")
  109. //DOM
  110. /* ТЕще дз: переписать подсветку таблицы используя минимум this.* и максимум переменных замыкания. Для этого Надо занести обработчики событий во вложенный for */
  111. function Table(rootElementClass) {
  112. let domElement = document.querySelector(`.${rootElementClass}`);
  113. this.tableCreate = () => {
  114. let table = document.createElement('table');
  115. for (let i = 0; i < 10; i++) {
  116. let tr = document.createElement('tr');
  117. table.append(tr);
  118. for (let k = 0; k < 10; k++) {
  119. let td = document.createElement('td');
  120. if (i === 0) {
  121. td.innerText = k;
  122. tr.append(td);
  123. } else if (k === 0) {
  124. td.innerText = i;
  125. tr.append(td);
  126. } else {
  127. td.innerText = i * k;
  128. tr.append(td);
  129. }
  130. }
  131. }
  132. domElement.append(table);
  133. }
  134. this.cellLigth = () => {
  135. const td = document.querySelectorAll('td');
  136. td.forEach((item, i) => {
  137. item.onmouseover = (e) => {
  138. item.style.backgroundColor = 'yellow';
  139. item.parentNode.style.backgroundColor = 'green';
  140. let trCollect = Array.from(item.parentElement.parentElement.children);
  141. trCollect.forEach((el, i) => {
  142. if (el.children[i].cellIndex === item.cellIndex) {
  143. Array.from(el.parentElement.children).forEach(elem => elem.children[i].style.backgroundColor = 'red');
  144. }
  145. });
  146. };
  147. item.onmouseout = () => {
  148. item.style.backgroundColor = '';
  149. item.parentNode.style.backgroundColor = '';
  150. let trCollect = Array.from(item.parentElement.parentElement.children);
  151. trCollect.forEach((el, i) => {
  152. if (el.children[i].cellIndex === item.cellIndex) {
  153. Array.from(el.parentElement.children).forEach(elem => elem.children[i].style.backgroundColor = '');
  154. }
  155. });
  156. }
  157. })
  158. }
  159. }
  160. let table1 = new Table('root');
  161. table1.tableCreate();
  162. table1.cellLigth();
  163. let table2 = new Table('root');
  164. table1.tableCreate();
  165. table1.cellLigth();