main.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. // makeProfileTimer
  2. function makeProfileTimer() {
  3. let prevTime = performance.now();
  4. function changeTime() {
  5. let nextTime = performance.now();
  6. return ('Время выполнения alert: ' + (nextTime - prevTime));
  7. }
  8. return changeTime;
  9. }
  10. let timer = makeProfileTimer()
  11. alert('Замеряем время работы этого alert');
  12. alert(timer())
  13. // or
  14. function makeProfileTimer() {
  15. alert('Замеряем время работы этого alert');
  16. }
  17. console.time('FirstWay');
  18. makeProfileTimer();
  19. console.timeEnd('FirstWay');
  20. // makeSaver
  21. function makeSaver(f) {
  22. let start = false;
  23. let result;
  24. return () => {
  25. if (start === false) {
  26. result = f();
  27. start = true;
  28. }
  29. return result;
  30. }
  31. }
  32. let nameSarver = makeSaver(() => prompt('Введите имя'))
  33. alert('Имя еще не спрашивали')
  34. let name1 = nameSarver()
  35. alert('Тока шо спросили имя')
  36. let name2 = nameSarver()
  37. alert('Два раза спрашивать имя - значит склероз')
  38. alert('Привет, ' + name1 + ((name1 === name2) ? '. Задача решена' : 'Какая-то дичь'))
  39. var saver = makeSaver(Math.random)
  40. var value1 = saver()
  41. var value2 = saver()
  42. value1 === value2 // всегда true
  43. var saver2 = makeSaver(() => console.log('saved function called') || [null, undefined, false, '', 0, Math.random()][Math.ceil(Math.random()*6)])
  44. var value3 = saver2()
  45. var value4 = saver2()
  46. value3 === value4 // тоже должно быть true
  47. // Final Countdown
  48. function SelfInvoked() {
  49. let countdown = 5;
  50. function t() {
  51. console.log(countdown--);
  52. setTimeout(() => console.log('поехали!'), 5000);
  53. if(!countdown)
  54. clearInterval(timer);
  55. }
  56. let timer = setInterval(t, 1000);
  57. }
  58. SelfInvoked() // запуск функции
  59. 5 //пауза 1 секунда
  60. 4 //пауза 1 секунда
  61. 3 //пауза 1 секунда
  62. 2 //пауза 1 секунда
  63. 1 //пауза 1 секунда
  64. // поехали!
  65. // myBind
  66. // решение
  67. function myBind (func, context, args) {
  68. return (...params) => {
  69. let defaultValue = 0;
  70. let newArgs = args.map((i) => (i === undefined ? params[defaultValue++] : i));
  71. return func.call(context, ... newArgs);
  72. }
  73. }
  74. // условие
  75. var pow5 = myBind(Math.pow, Math, [undefined, 5]) // первый параметр - функция для биндинга значений по умолчанию,
  76. // второй - this для этой функции, третий - массив, в котором undefined означает
  77. // параметры, которые должны передаваться при вызове,
  78. // а другие значения являются значениями по умолчанию:
  79. var cube = myBind(Math.pow, Math, [undefined, 3]) // cube возводит число в куб
  80. pow5(2) // => 32, вызывает Math.pow(2,5), соотнесите с [undefined, 5]
  81. cube(3) // => 27
  82. var chessMin = myBind(Math.min, Math, [undefined, 4, undefined, 5,undefined, 8,undefined, 9])
  83. chessMin(-1,-5,3,15) // вызывает Math.min(-1, 4, -5, 5, 3, 8, 15, 9), результат -5
  84. var zeroPrompt = myBind(prompt, window, [undefined, "0"]) // аналогично, только теперь задается "0" как текст по умолчанию в prompt,
  85. // а текст приглашения пользователя задается при вызове zeroPrompt
  86. var someNumber = zeroPrompt("Введите число") // вызывает prompt("Введите число","0")
  87. myBind((...params) => params.join(''), null, [undefined, 'b', undefined, undefined, 'e', 'f'])('a','c','d') === 'abcdef'