script.js 4.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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. Напишите функцию makeSaver, которая: */
  27. //var saver = makeSaver(Math.random) //создает функцию-хранилище результата переданной в качестве параметра функции (Math.random
  28. // в примере). На этом этапе Math.random НЕ вызывается
  29. //var value1 = saver() //saver вызывает переданную в makeSaver функцию, запоминает результат и возвращает его
  30. //var value2 = saver() //saver в дальнейшем просто хранит результат функции, и более НЕ вызывает переданную
  31. //в makeSaver функцию;
  32. //value1 === value2 // всегда true
  33. //var saver2 = makeSaver(() => console.log('saved function called') || [null, undefined, false, '', 0, Math.random()][Math.ceil(Math.random()//*6)])
  34. //var value3 = saver2()
  35. //var value4 = saver2()
  36. //value3 === value4 // тоже должно быть true
  37. /* let namePrompt = prompt.bind(window, 'Как тебя зовут?')
  38. let nameSaver = makeSaver(namePrompt)
  39. alert(`Привет! Prompt еще не было!`)
  40. alert(`Привет ${nameSaver()}. Только что запустился prompt, первый и последний раз`)
  41. alert(`Слушай, ${nameSaver()}, го пить пиво. Ведь prompt был только один раз`) */
  42. /* Таким образом makeSaver решает две задачи:
  43. Навсегда сохраняет результат функции. Это актуально, например, для Math.random.
  44. Действует лениво, то есть вызывает Math.random только тогда, когда результат действительно нужен. Если же по каким-то причинам значение не понадобится, то Math.random даже не будет вызван */
  45. function makeSaver(func){
  46. let funcRes;
  47. console.log(funcRes);
  48. return function(){
  49. return func;
  50. }
  51. }
  52. console.log(makeSaver());
  53. let saver = makeSaver(Math.random)
  54. console.log(saver);
  55. //console.log(saver());
  56. //console.log(saver());
  57. var value1 = saver() //saver вызывает переданную в makeSaver функцию, запоминает результат и возвращает его
  58. var value2 = saver() //saver в дальнейшем просто хранит результат функции, и более НЕ вызывает переданную
  59. //в makeSaver функцию;
  60. //console.log(value1 === value2); // всегда true