|
@@ -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)
|