script.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. function makeProfileTimer() {
  2. let time1 = performance.now()
  3. let timeInner = () => {
  4. let time2 = performance.now()
  5. return time2 - time1
  6. }
  7. return timeInner;
  8. }
  9. // var timer = makeProfileTimer()
  10. // alert('Замеряем время работы этого alert'); //некий код, время выполнения которого мы хотим измерить с высокой точностью
  11. // alert(timer()); //alert должен вывести время в микросекундах от выполнения makeProfileTimer до момента вызова timer(),
  12. // // т. е. измерить время выполнения alert
  13. function makeSaver(funk) {
  14. let savedResult
  15. let saverInner = () => {
  16. if (savedResult == undefined) {
  17. savedResult = funk()
  18. }
  19. return savedResult
  20. }
  21. return saverInner
  22. }
  23. var saver = makeSaver(Math.random) //создает функцию-хранилище результата переданной в качестве параметра функции (Math.random
  24. // в примере). На этом этапе Math.random НЕ вызывается
  25. var value1 = saver() //saver вызывает переданную в makeSaver функцию, запоминает результат и возвращает его
  26. var value2 = saver() //saver в дальнейшем просто хранит результат функции, и более НЕ вызывает переданную
  27. //в makeSaver функцию;
  28. value1 === value2 // всегда true
  29. var saver2 = makeSaver(() => console.log('saved function called') || [null, undefined, false, '', 0, Math.random()][Math.ceil(Math.random()*6)])
  30. var value3 = saver2()
  31. var value4 = saver2()
  32. value3 === value4 // тоже должно быть true
  33. function starter (number) {
  34. console.log(number)
  35. number = number - 1
  36. starterInner()
  37. function starterInner() {
  38. setTimeout(() => {
  39. if(number > 0){
  40. console.log(number)
  41. number = number-1
  42. return starterInner(number)
  43. } else {
  44. return console.log("done")
  45. }
  46. }, 1000)
  47. }
  48. }
  49. // starter(5)
  50. ///myBind
  51. function myBind(funk, context) {
  52. let arg = [].slice.call(arguments, 2);
  53. arg = arg[0].filter(index => index != undefined)
  54. return function () {
  55. debugger
  56. let newArg = [].slice.call(arguments);
  57. return funk.apply(context, newArg.concat(arg))
  58. }
  59. }
  60. var pow5 = myBind(Math.pow, Math, [undefined, 5]) // первый параметр - функция для биндинга значений по умолчанию,
  61. // второй - this для этой функции, третий - массив, в котором undefined означает
  62. // параметры, которые должны передаваться при вызове,
  63. // а другие значения являются значениями по умолчанию:
  64. var cube = myBind(Math.pow, Math, [undefined, 3]) // cube возводит число в куб
  65. console.log(pow5(2)) // => 32, вызывает Math.pow(2,5), соотнесите с [undefined, 5]
  66. console.log(cube(3)) // => 27
  67. var chessMin = myBind(Math.min, Math, [undefined, 4, undefined, 5,undefined, 8,undefined, 9])
  68. console.log(chessMin(-1,-5,3,15)) // вызывает Math.min(-1, 4, -5, 5, 3, 8, 15, 9), результат -5
  69. var zeroPrompt = myBind(prompt, window, [undefined, "0"]) // аналогично, только теперь задается "0" как текст по умолчанию в prompt,
  70. // а текст приглашения пользователя задается при вызове zeroPrompt
  71. var someNumber = zeroPrompt("Введите число") // вызывает prompt("Введите число","0")