|
@@ -0,0 +1,135 @@
|
|
|
|
+// makeProfileTimer
|
|
|
|
+
|
|
|
|
+// Напишите функцию makeProfileTimer, которая служит для замера времени выполнения другого кода и работает следующим образом:
|
|
|
|
+
|
|
|
|
+// var timer = makeProfileTimer()
|
|
|
|
+// alert('Замеряем время работы этого alert'); некий код, время выполнения которого мы хотим измерить с высокой точностью
|
|
|
|
+// alert(timer()); alert должен вывести время в микросекундах от выполнения makeProfileTimer до момента вызова timer(),
|
|
|
|
+// т. е. измерить время выполнения alert
|
|
|
|
+
|
|
|
|
+// Используйте performance.now()
|
|
|
|
+
|
|
|
|
+function makeProfileTimer() {
|
|
|
|
+ var t1 = performance.now();
|
|
|
|
+ return function () {
|
|
|
|
+ var t2 = performance.now();
|
|
|
|
+ return (t2 - t1);
|
|
|
|
+ };
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+var timer = makeProfileTimer();
|
|
|
|
+alert('Замеряем время работы этого alert');
|
|
|
|
+alert(timer());
|
|
|
|
+
|
|
|
|
+// makeSaver
|
|
|
|
+
|
|
|
|
+// Напишите функцию makeSaver, которая:
|
|
|
|
+
|
|
|
|
+// 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 был только один раз`)
|
|
|
|
+
|
|
|
|
+// Таким образом makeSaver решает две задачи:
|
|
|
|
+
|
|
|
|
+// * Навсегда сохраняет результат функции.Это актуально, например, для Math.random.
|
|
|
|
+// * Действует лениво, то есть вызывает Math.random только тогда, когда результат действительно нужен.
|
|
|
|
+// Если же по каким - то причинам значение не понадобится, то Math.random даже не будет вызван
|
|
|
|
+
|
|
|
|
+function makeSaver(callback) {
|
|
|
|
+ let result, executed = !1;
|
|
|
|
+ return function () {
|
|
|
|
+ return executed ? result : (executed = !0, res = callback());
|
|
|
|
+ };
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+var saver = makeSaver(Math.random)
|
|
|
|
+
|
|
|
|
+let value1 = saver();
|
|
|
|
+let value2 = saver();
|
|
|
|
+value1 === value2;
|
|
|
|
+
|
|
|
|
+function fun() {
|
|
|
|
+ return console.log('saved function called') || [null, undefined, false, '', 0, Math.random()][Math.ceil(Math.random() * 6)]
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+var saver2 = makeSaver(fun)
|
|
|
|
+
|
|
|
|
+var value3 = saver2()
|
|
|
|
+var value4 = saver2()
|
|
|
|
+
|
|
|
|
+value3 === value4
|
|
|
|
+
|
|
|
|
+let namePrompt = prompt.bind(window, 'Как тебя зовут?');
|
|
|
|
+let nameSaver = makeSaver(namePrompt);
|
|
|
|
+alert(`Привет! Prompt еще не было!`)
|
|
|
|
+alert(`Привет ${nameSaver()}. Только что запустился prompt, первый и последний раз`)
|
|
|
|
+alert(`Слушай, ${nameSaver()}, го пить пиво. Ведь prompt был только один раз`)
|
|
|
|
+
|
|
|
|
+// myBind
|
|
|
|
+
|
|
|
|
+// Изучите встроенную функцию bind, и сделайте свою версию, которая позволит определить "значение по умолчанию" не только для первых параметров,
|
|
|
|
+// но для любых других, например для степени в Math.pow:
|
|
|
|
+
|
|
|
|
+// var pow5 = myBind(Math.pow, Math, [undefined, 5]) первый параметр - функция для биндинга значений по умолчанию,
|
|
|
|
+// второй - this для этой функции, третий - массив, в котором undefined означает
|
|
|
|
+// параметры, которые должны передаваться при вызове,
|
|
|
|
+// а другие значения являются значениями по умолчанию:
|
|
|
|
+// 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])
|
|
|
|
+// 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")
|
|
|
|
+
|
|
|
|
+// myBind((...params) => params.join(''), null, [undefined, 'b', undefined, undefined, 'e', 'f'])('a', 'c', 'd') === 'abcdef'
|
|
|
|
+// Массив, который идет третьим параметром определяет, какие поля должны подменяться значением по умолчанию,
|
|
|
|
+// а какие - задаваться в последствии(undefined).
|
|
|
|
+
|
|
|
|
+let myBind = function (fn, context, arr) {
|
|
|
|
+ return function () {
|
|
|
|
+ let index = 0
|
|
|
|
+ var fnArgs = [].slice.call(arguments);
|
|
|
|
+ return fn.apply(context, arr.map(i => {
|
|
|
|
+ if (i === undefined) {
|
|
|
|
+ let newValue = fnArgs[index]
|
|
|
|
+ index++
|
|
|
|
+ return newValue
|
|
|
|
+ }
|
|
|
|
+ else return i
|
|
|
|
+ }));
|
|
|
|
+ };
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+var pow5 = myBind(Math.pow, Math, [undefined, 5]);
|
|
|
|
+var cube = myBind(Math.pow, Math, [undefined, 3]);
|
|
|
|
+alert(pow5(2));
|
|
|
|
+alert(cube(3));
|
|
|
|
+
|
|
|
|
+var chessMin = myBind(Math.min, Math, [undefined, 4, undefined, 5, undefined, 8, undefined, 9])
|
|
|
|
+chessMin(-1, -5, 3, 15);
|
|
|
|
+
|
|
|
|
+var zeroPrompt = myBind(prompt, window, [undefined, "0"])
|
|
|
|
+var someNumber = zeroPrompt("Введите число")
|
|
|
|
+alert(someNumber);
|
|
|
|
+
|
|
|
|
+myBind((...params) => params.join(''), null, [undefined, 'b', undefined, undefined, 'e', 'f'])('a', 'c', 'd') === 'abcdef'
|