Browse Source

HW<12>done

Gennadysht 2 years ago
parent
commit
ff24e85548
5 changed files with 149 additions and 0 deletions
  1. 17 0
      js/12/hw12_01_Make Timer.html
  2. 40 0
      js/12/hw12_02_ saver.html
  3. 54 0
      js/12/hw12_03_.html
  4. 17 0
      js/12/hw12_04_.html
  5. 21 0
      js/12/hw12_05_ .html

+ 17 - 0
js/12/hw12_01_Make Timer.html

@@ -0,0 +1,17 @@
+<header>make profile timer</header>
+
+<body>
+    <script>
+        const makeProfileTimer = () => {
+            let startTime = performance.now();
+            function timer() {
+                return performance.now() - startTime;
+            }
+            return timer;
+        }
+        var timer = makeProfileTimer()
+        alert('Замеряем время работы этого alert');  //некий код, время выполнения которого мы хотим измерить с высокой точностью
+        alert(timer()); //alert должен вывести время в микросекундах от выполнения makeProfileTimer до момента вызова timer(), 
+                   // т. е. измерить время выполнения alert
+    </script>
+</body>

+ 40 - 0
js/12/hw12_02_ saver.html

@@ -0,0 +1,40 @@
+<header>make Saver</header>
+
+<body>
+    <script>
+        const makeSaver = (func) => {
+            let valueSet = false;
+            let savedValue = null;
+            const saver = () => {
+                if (!valueSet) {
+                    savedValue = func();
+                    valueSet = true;
+                }
+                return savedValue;
+            }
+            return saver;
+        }
+
+
+        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 был только один раз`)
+    </script>
+</body>

+ 54 - 0
js/12/hw12_03_.html

@@ -0,0 +1,54 @@
+<header>My bind</header>
+
+<body>
+    <script>
+        const myBind = (myFunc, myThis, [...myDefArgs]) => {
+            const bindFunc = (...args) => {
+                let curArgs = [];
+                let i = 0;
+                let argsLength = args.length;
+                for (defArg of myDefArgs) {
+                    if (defArg == null) {
+                        if (i < argsLength) {
+                            curArgs.push(args[i]);
+                            i++;
+                        }
+                    }
+                    else
+                        curArgs.push(defArg);
+                }
+                for (; i < argsLength; i++)
+                    curArgs.push(args[i]);
+                return myFunc.call(myThis, ...curArgs);
+                /*var myBindedFunc = myFunc.bind(myThis, ...curArgs);
+                return myBindedFunc();*/
+
+            }
+            return bindFunc;
+        }
+        var pow5 = myBind(Math.pow, Math, [, 5]) // первый параметр - функция для биндинга значений по умолчанию, 
+        // второй - this для этой функции, третий - массив, в котором undefined означает
+        // параметры, которые должны передаваться при вызове,
+        // а другие значения являются значениями по умолчанию:
+        var cube = myBind(Math.pow, Math, [, 3]) // cube возводит число в куб
+
+        pow5(2) // => 32, вызывает Math.pow(2,5), соотнесите с [undefined, 5]
+        cube(3) // => 27
+
+
+        var chessMin = myBind(Math.min, Math, [, 4, , 5, , 8, , 9])
+        chessMin(-1, -5, 3, 15) // вызывает Math.min(-1, 4, -5, 5, 3, 8, 15, 9), результат -5
+
+
+
+        var zeroPrompt = myBind(prompt, window, [undefined, "0"]) // аналогично, только теперь задается "0" как текст по умолчанию в prompt, 
+        // а текст приглашения пользователя задается при вызове zeroPrompt
+        var someNumber = zeroPrompt("Введите число")              // вызывает prompt("Введите число","0")
+
+        const bindedJoiner = myBind((...params) => params.join(''), null, [, 'b', , , 'e', 'f'])//('a','c','d') === 'abcdef'
+        bindedJoiner('a', 'c', 'd') === 'abcdef'
+        bindedJoiner('1', '2', '3') === '1b23ef'
+        console.log(bindedJoiner('a', 'c', 'd'));
+        console.log(bindedJoiner('1', '2', '3'));
+    </script>
+</body>

+ 17 - 0
js/12/hw12_04_.html

@@ -0,0 +1,17 @@
+<header>make profile timer</header>
+
+<body>
+    <script>
+        const makeProfileTimer = () => {
+            let startTime = performance.now();
+            function timer() {
+                return performance.now() - startTime;
+            }
+            return timer;
+        }
+        var timer = makeProfileTimer()
+        alert('Замеряем время работы этого alert');  //некий код, время выполнения которого мы хотим измерить с высокой точностью
+        alert(timer()); //alert должен вывести время в микросекундах от выполнения makeProfileTimer до момента вызова timer(), 
+                   // т. е. измерить время выполнения alert
+    </script>
+</body>

+ 21 - 0
js/12/hw12_05_ .html

@@ -0,0 +1,21 @@
+<header>make profile timer</header>
+
+<body>
+    <script>
+        function checkResult(original, validator) {
+            function wrapper(...params) {
+                let result = null;
+                while (validator(result = original(...params)) == false);
+                return result;
+            }
+            return wrapper
+        }
+
+        //numberPrompt - это функция, которая будет запускать prompt до тех пор, пока пользователь не введет число
+        const numberPrompt = checkResult(prompt, x => !isNaN(+x))
+        let number = +numberPrompt("Введите число", "0")  //параметры передаются насквозь в оригинал. Не забудьте передать this, используя call или apply
+        //gamePrompt - это функция, которая будет запускать prompt до тех пор, пока пользователь не введет одно из слов 'камень', 'ножницы', 'бумага'
+        const gamePrompt = checkResult(prompt, x => ['камень', 'ножницы', 'бумага'].includes(x.toLowerCase()))
+        const turn = gamePrompt("Введите что то из списка: 'камень', 'ножницы', 'бумага'")
+    </script>
+</body>