script.js 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. // makeProfileTimer
  2. function makeProfileTimer() {
  3. function remembered() {
  4. return performance.now()
  5. }
  6. return remembered
  7. }
  8. let timer = makeProfileTimer()
  9. alert('hello')
  10. alert(timer())
  11. // makeSaver
  12. function makeSaver(func) {
  13. let value = func()
  14. return function invoker() {
  15. return value
  16. }
  17. }
  18. var saver = makeSaver(Math.random) //создает функцию-хранилище результата переданной в качестве параметра функции (Math.random
  19. // в примере). На этом этапе Math.random НЕ вызывается
  20. var value1 = saver() //saver вызывает переданную в makeSaver функцию, запоминает результат и возвращает его
  21. var value2 = saver() //saver в дальнейшем просто хранит результат функции, и более НЕ вызывает переданную
  22. //в makeSaver функцию;
  23. console.log('is?', value1, value2)
  24. console.log('is equal?', value1 === value2) // всегда true
  25. var saver2 = makeSaver(() => console.log('saved function called') || [null, undefined, false, '', 0, Math.random()][Math.ceil(Math.random() * 6)])
  26. var value3 = saver2()
  27. var value4 = saver2()
  28. console.log('is equal?', value3 === value4) // тоже должно быть true
  29. // Final Countdown
  30. var finalCountdown = (function (sec) {
  31. var counter = sec;
  32. return function repeat() {
  33. window.setTimeout(()=>{
  34. if(counter > 0) {
  35. console.log(counter)
  36. counter -= 1
  37. repeat()
  38. } else {
  39. return console.log('поехали')
  40. }
  41. },1000)
  42. }
  43. })(5);
  44. finalCountdown()
  45. // myBind
  46. let myBind = function myBind(func, context, [...args]) {
  47. return function inner(...used) {
  48. let arr = [...args]
  49. let j = 0
  50. for(let i = 0; i < arr.length; i++) {
  51. if(arr[i] === undefined) {
  52. arr[i] = [...used][j]
  53. j++
  54. }
  55. }
  56. return func.apply(context, arr)
  57. }
  58. }
  59. let pow5 = myBind(Math.pow, Math, [undefined, 5])
  60. console.log(pow5(2))
  61. console.log(pow5(3))
  62. console.log(pow5(1))
  63. console.log(Math.pow.apply(Math, [2,5]))
  64. var chessMin = myBind(Math.min, Math, [undefined, 4, undefined, 5,undefined, 8,undefined, 9])
  65. console.log(chessMin(-1,-5,3,15)) // вызывает Math.min(-1, 4, -5, 5, 3, 8, 15, 9), результат -5
  66. var zeroPrompt = myBind(prompt, window, [undefined, "0"]) // аналогично, только теперь задается "0" как текст по умолчанию в prompt,
  67. // а текст приглашения пользователя задается при вызове zeroPrompt
  68. //var someNumber = zeroPrompt("Введите число")
  69. console.log(myBind((...params) => params.join(''), null, [undefined, 'b', undefined, undefined, 'e', 'f'])('a','c','d') === 'abcdef')