main.js 6.6 KB

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