Замыкания.js 4.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. //makeProfileTimer
  2. {
  3. function makeProfileTimer(){
  4. let start = performance.now();
  5. return ()=>performance.now()-start
  6. }
  7. var timer = makeProfileTimer()
  8. alert('Замеряем время работы этого alert'); //некий код, время выполнения которого мы хотим измерить с высокой точностью
  9. alert(timer()); //alert должен вывести время в микросекундах от выполнения makeProfileTimer до момента вызова timer(),
  10. // т. е. измерить время выполнения alert
  11. }
  12. //makeSaver
  13. {
  14. let makeSaver= (param) =>{
  15. let i = 0
  16. let paramSaved
  17. return ()=>{
  18. if(i===0){
  19. i++
  20. return paramSaved=param()
  21. }
  22. else{
  23. return paramSaved
  24. }
  25. }
  26. }
  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(prompt.bind(window, 'Как тебя зовут?'))
  39. alert(`Привет! Prompt еще не было!`)
  40. alert(`Привет ${nameSaver()}. Только что запустился prompt, первый и последний раз`)
  41. alert(`Слушай, ${nameSaver()}, го пить пиво. Ведь prompt был только один раз`)
  42. }
  43. //myBind
  44. {
  45. function myBind (func,zis,arr){
  46. return function (...param){
  47. let arr2=[]
  48. for(el of arr){
  49. if(typeof el === 'undefined'){
  50. arr2.push(param[0])
  51. param=param.slice(1)
  52. }
  53. else{arr2.push(el)}
  54. }
  55. return func(...arr2)
  56. }
  57. }
  58. var pow5 = myBind(Math.pow, Math, [, 5]) // первый параметр - функция для биндинга значений по умолчанию,
  59. // второй - this для этой функции, третий - массив, в котором undefined означает
  60. // параметры, которые должны передаваться при вызове,
  61. // а другие значения являются значениями по умолчанию:
  62. var cube = myBind(Math.pow, Math, [, 3]) // cube возводит число в куб
  63. pow5(2) // => 32, вызывает Math.pow(2,5), соотнесите с [undefined, 5]
  64. cube(3) // => 27
  65. var chessMin = myBind(Math.min, Math, [, 4, , 5,, 8,, 9])
  66. 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. bindedJoiner('a','c','d') === 'abcdef'
  72. bindedJoiner('1','2','3') === '1b23ef'
  73. }