script.js 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. // makeProfileTimer
  2. function makeProfileTimer() {
  3. let old = performance.now()
  4. function remembered() {
  5. return performance.now() - old
  6. }
  7. return remembered
  8. }
  9. let timer = makeProfileTimer()
  10. alert('hello')
  11. alert(timer())
  12. // makeSaver
  13. function makeSaver(func) {
  14. let value = func
  15. return () => {
  16. function vault() {
  17. value = value()
  18. }
  19. if(typeof value === 'function') vault()
  20. return value
  21. }
  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. console.log('is?', value1, value2)
  29. console.log('is equal?', 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. console.log('3 & 4', value3, value4)
  34. console.log('is equal?', value3 === value4) // тоже должно быть true
  35. let namePrompt = prompt.bind(window, 'Как тебя зовут?')
  36. let nameSaver = makeSaver(namePrompt)
  37. alert(`Привет! Prompt еще не было!`)
  38. alert(`Привет ${nameSaver()}. Только что запустился prompt, первый и последний раз`)
  39. alert(`Слушай, ${nameSaver()}, го пить пиво. Ведь prompt был только один раз`)
  40. // Final Countdown
  41. var finalCountdown = (function (sec) {
  42. var counter = sec;
  43. return function repeat() {
  44. window.setTimeout(()=>{
  45. if(counter > 0) {
  46. console.log(counter)
  47. counter -= 1
  48. repeat()
  49. } else {
  50. return console.log('поехали')
  51. }
  52. },1000)
  53. }
  54. })(5);
  55. finalCountdown()
  56. // myBind
  57. let myBind = function myBind(func, context, [...args]) {
  58. return function inner(...used) {
  59. let arr = [...args]
  60. let j = 0
  61. for(let i = 0; i < arr.length; i++) {
  62. if(arr[i] === undefined) {
  63. arr[i] = [...used][j]
  64. j++
  65. }
  66. }
  67. return func.apply(context, arr)
  68. }
  69. }
  70. let pow5 = myBind(Math.pow, Math, [undefined, 5])
  71. console.log(pow5(2))
  72. console.log(pow5(3))
  73. console.log(pow5(1))
  74. console.log(Math.pow.apply(Math, [2,5]))
  75. var chessMin = myBind(Math.min, Math, [undefined, 4, undefined, 5,undefined, 8,undefined, 9])
  76. console.log(chessMin(-1,-5,3,15)) // вызывает Math.min(-1, 4, -5, 5, 3, 8, 15, 9), результат -5
  77. var zeroPrompt = myBind(prompt, window, [undefined, "0"]) // аналогично, только теперь задается "0" как текст по умолчанию в prompt,
  78. // а текст приглашения пользователя задается при вызове zeroPrompt
  79. //var someNumber = zeroPrompt("Введите число")
  80. console.log(myBind((...params) => params.join(''), null, [undefined, 'b', undefined, undefined, 'e', 'f'])('a','c','d') === 'abcdef')