Browse Source

HW Closures

LenDoc 2 years ago
parent
commit
f9191fe211
1 changed files with 92 additions and 0 deletions
  1. 92 0
      js/09/main.js

+ 92 - 0
js/09/main.js

@@ -0,0 +1,92 @@
+//1 вариант
+function myTimer() {
+    let time = performance.now();
+    return function() {
+        time = performance.now() - time;
+        return ((time / 1000).toFixed(3))
+    }
+}
+//2 вариант
+function myTimer2() {
+    const start = new Date().getTime();
+    return function() {
+        const end = new Date().getTime();
+        return ((end - start) / 1000)
+    }
+}
+
+//var timer = myTimer()
+//alert('Замеряем время работы этого alert'); //некий код, время выполнения которого мы хотим измерить с высокой точностью
+//alert(timer()); //alert должен вывести время в микросекундах от выполнения makeProfileTimer до момента вызова timer(), 
+// // т. е. измерить время выполнения alert
+//1 вариант
+function makeSaver(func) {
+    let result;
+    return function() {
+        result = func();
+    }
+}
+// 2 вариант через стрелочную функцию 
+var makeSaver2 = (makeSaver2) => () => makeSaver2()
+    // var saver = func(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()
+
+// let a = value3 === value4 // тоже должно быть true
+// console.log(a);
+
+//Final Countdown Self Invoked Function
+let i = 6;
+(function timer() {
+
+    if (--i < 1) {
+        console.log('поехали')
+        return
+    } else {
+        setTimeout(() => {
+            console.log(i);
+            timer()
+        }, 1000);
+    }
+
+})();
+
+//my bind
+function myBind(func, context, bindArguments) {
+    return function(...args) {
+        let newArgs = [];
+        let iter = 0;
+        for (let i in bindArguments) {
+            //если в параметрах 
+            //по умолчани есть undefined,
+            // пушим полученные параметры вместо него
+            if (bindArguments[i] === undefined) {
+                newArgs.push(args[iter])
+                iter++
+            } else {
+                newArgs.push(bindArguments[i])
+            }
+        }
+        return func.apply(context, newArgs);
+    }
+}
+// var pow5 = myBind(Math.pow, Math, [undefined, 5])
+// console.log(pow5(2))
+// var cube = myBind(Math.pow, Math, [undefined, 3]) // cube возводит число в куб
+
+// pow5(2) // => 32, вызывает Math.pow(2,5), соотнесите с [undefined, 5]
+// cube(3) // => 27
+
+
+// var chessMin = myBind(Math.min, Math, [undefined, 4, undefined, 5, undefined, 8, undefined, 9])
+// console.log(chessMin(-1, -5, 3, 15)) // вызывает Math.min(-1, 4, -5, 5, 3, 8, 15, 9), результат -5
+
+// let res = myBind((...params) => params.join(''), null, [undefined, 'b', undefined, undefined, 'e', 'f'])('a', 'c', 'd') === 'abcdef'
+// console.log(res)