main.js 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. //makeProfileTimer
  2. {
  3. const makeProfileTimer = () => {
  4. const startOfTime = performance.now()
  5. function timer() {
  6. return performance.now() - startOfTime
  7. }
  8. return timer
  9. }
  10. var timer = makeProfileTimer()
  11. alert('Замеряем время работы этого alert'); //некий код, время выполнения которого мы хотим измерить с высокой точностью
  12. alert(timer());
  13. //alert должен вывести время в микросекундах от выполнения makeProfileTimer до момента вызова timer(),
  14. // т. е. измерить время выполнения alert
  15. }
  16. //makeSaver
  17. {
  18. var saver = makeSaver(Math.random) //создает функцию-хранилище результата переданной в качестве параметра функции (Math.random
  19. // в примере). На этом этапе Math.random НЕ вызывается
  20. function makeSaver (func){
  21. let result
  22. return function() {
  23. return result ? result : result = func()
  24. }
  25. }
  26. var value1 = saver() //saver вызывает переданную в makeSaver функцию, запоминает результат и возвращает его
  27. var value2 = saver() //saver в дальнейшем просто хранит результат функции, и более НЕ вызывает переданную
  28. //в makeSaver функцию;
  29. value1 === value2 // всегда true
  30. var saver2 = makeSaver(() => console.log('saved function called') || [null, undefined, false, '', 0, Math.random()][Math.ceil(Math.random()*6)])
  31. var value3 = saver2()
  32. var value4 = saver2()
  33. value3 === value4 // тоже должно быть true
  34. let namePrompt = prompt.bind(window, 'Как тебя зовут?')
  35. let nameSaver = makeSaver(namePrompt)
  36. alert(`Привет! Prompt еще не было!`)
  37. alert(`Привет ${nameSaver()}. Только что запустился prompt, первый и последний раз`)
  38. alert(`Слушай, ${nameSaver()}, го пить пиво. Ведь prompt был только один раз`)
  39. }
  40. //myBind
  41. {
  42. function myBind(func,zis,deflt){
  43. function myVariant(...args) {
  44. let [...newArray] = deflt
  45. let i = 0
  46. let j = 0
  47. for (let element of deflt){
  48. if(element === undefined){
  49. newArray[i] = args[j]
  50. j++
  51. }
  52. i++
  53. }
  54. return func.apply(zis,newArray)
  55. }
  56. return myVariant
  57. }
  58. var pow5 = myBind(Math.pow, Math, [, 5]) // первый параметр - функция для биндинга значений по умолчанию,
  59. // второй - this для этой функции, третий - массив, в котором undefined означает
  60. // параметры, которые должны передаваться при вызове,
  61. // а другие значения являются значениями по умолчанию:
  62. var cube = myBind(Math.pow, Math, [, 3]) // cube возводит число в куб
  63. console.log(pow5(2)) // => 32, вызывает Math.pow(2,5), соотнесите с [undefined, 5]
  64. console.log(cube(3)) // => 27
  65. var chessMin = myBind(Math.min, Math, [, 4, , 5,, 8,, 9])
  66. console.log(chessMin(-1,-5,3,15)) // вызывает Math.min(-1, 4, -5, 5, 3, 8, 15, 9), результат -5
  67. var zeroPrompt = myBind(prompt, window, [undefined, "0"]) // аналогично, только теперь задается "0" как текст по умолчанию в prompt,
  68. // а текст приглашения пользователя задается при вызове zeroPrompt
  69. var someNumber = zeroPrompt("Введите число") // вызывает prompt("Введите число","0")
  70. const bindedJoiner = myBind((...params) => params.join(''), null, [, 'b', , , 'e', 'f'])//('a','c','d') === 'abcdef'
  71. console.log(bindedJoiner('a','c','d') === 'abcdef')
  72. console.log(bindedJoiner('1','2','3') === '1b23ef')
  73. }
  74. //CheckResult
  75. {
  76. function checkResult(original, validator){
  77. function wrapper(...params){
  78. let result = null
  79. do {
  80. result = original.apply(this,params)
  81. } while(validator.call(this,result) === false)
  82. return console.log(result)
  83. }
  84. return wrapper
  85. }
  86. //numberPrompt - это функция, которая будет запускать prompt до тех пор, пока пользователь не введет число
  87. const numberPrompt = checkResult(prompt, x => !isNaN(+x))
  88. let number = +numberPrompt("Введите число", "0") //параметры передаются насквозь в оригинал. Не забудьте передать this, используя call или apply
  89. //gamePrompt - это функция, которая будет запускать prompt до тех пор, пока пользователь не введет одно из слов 'камень', 'ножницы', 'бумага'
  90. const gamePrompt = checkResult(prompt, x => ['камень', 'ножницы', 'бумага'].includes(x.toLowerCase()))
  91. const turn = gamePrompt("Введите что то из списка: 'камень', 'ножницы', 'бумага'")
  92. const randomHigh = checkResult(Math.random,x => x>0.5 && x<1 )
  93. const result = randomHigh()
  94. const alwaysSayYes = checkResult(confirm,x=> x === true )
  95. const choise = alwaysSayYes("Choose!!!")
  96. }