Browse Source

<HW_closures>upd

Mark 1 year ago
parent
commit
4984b78c70
3 changed files with 58 additions and 0 deletions
  1. 43 0
      09/main.js
  2. 15 0
      10/index.html
  3. 0 0
      10/main.js

+ 43 - 0
09/main.js

@@ -15,3 +15,46 @@ for (let i = 0; i <= 5; i++) {
    setTimeout(() => { i === 5 ? console.log('поехали!') : console.log(5 - i) }, i * 1000)
 }
 
+// makeSaver
+
+function makeSaver(data) {
+   let hasBeenCalled = false;
+   let cashedResult;
+   return function (...args) {
+      if (hasBeenCalled) {
+         return cashedResult;
+      }
+      else {
+         hasBeenCalled = true;
+         cashedResult = data(...args);
+         return cashedResult;
+      }
+   }
+
+}
+
+var saver = makeSaver(Math.random) //создает функцию-хранилище результата переданной в качестве параметра функции (Math.random 
+// в примере). На этом этапе Math.random НЕ вызывается
+var value1 = saver()              //saver вызывает переданную в makeSaver функцию, запоминает результат и возвращает его
+var value2 = saver()              //saver в дальнейшем просто хранит результат функции, и более НЕ вызывает переданную 
+//в makeSaver функцию;
+value1 === value2                 // всегда true
+
+var saver2 = makeSaver(() => console.log('saved function called') || [null, undefined, false, '', 0, Math.random()][Math.ceil(Math.random() * 6)])
+var value3 = saver2()
+var value4 = saver2()
+
+value3 === value4 // тоже должно быть true
+
+
+
+let namePrompt = prompt.bind(window, 'Как тебя зовут?')
+let nameSaver = makeSaver(namePrompt)
+alert(`Привет! Prompt еще не было!`)
+alert(`Привет ${nameSaver()}. Только что запустился prompt, первый и последний раз`)
+alert(`Слушай, ${nameSaver()}, го пить пиво. Ведь prompt был только один раз`)
+
+
+
+
+

+ 15 - 0
10/index.html

@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+   <meta charset="UTF-8">
+   <meta http-equiv="X-UA-Compatible" content="IE=edge">
+   <meta name="viewport" content="width=device-width, initial-scale=1.0">
+   <title>Document</title>
+</head>
+
+<body>
+   <script src="main.js"></script>
+</body>
+
+</html>

+ 0 - 0
10/main.js