|
@@ -1,3 +1,118 @@
|
|
'use strict';
|
|
'use strict';
|
|
|
|
|
|
-console.log('hello');
|
|
|
|
|
|
+//Замыкания
|
|
|
|
+//makeProfileTimer
|
|
|
|
+//Напишите функцию makeProfileTimer, которая служит для замера времени выполнения другого кода и работает следующим образом:
|
|
|
|
+//Используйте performance.now()
|
|
|
|
+// const makeProfileTimer = () => () => performance.now();
|
|
|
|
+// const timer = makeProfileTimer();
|
|
|
|
+
|
|
|
|
+// alert('Замеряем время работы этого alert'); //некий код, время выполнения которого мы хотим измерить с высокой точностью
|
|
|
|
+// alert(timer()); //alert должен вывести время в микросекундах от выполнения makeProfileTimer до момента вызова timer(),
|
|
|
|
+// т. е. измерить время выполнения alert
|
|
|
|
+
|
|
|
|
+//makeSaver
|
|
|
|
+//Напишите функцию makeSaver, которая:
|
|
|
|
+
|
|
|
|
+// const makeSaver = (fn) => () => fn;
|
|
|
|
+
|
|
|
|
+// const saver = makeSaver(Math.random);
|
|
|
|
+// const value1 = saver();
|
|
|
|
+// const value2 = saver();
|
|
|
|
+// console.log(value1 === value2);
|
|
|
|
+
|
|
|
|
+// const saver2 = makeSaver(
|
|
|
|
+// () =>
|
|
|
|
+// console.log('saved function called') ||
|
|
|
|
+// [null, undefined, false, '', 0, Math.random()][Math.ceil(Math.random() * 6)]
|
|
|
|
+// );
|
|
|
|
+// const value3 = saver2();
|
|
|
|
+// const value4 = saver2();
|
|
|
|
+
|
|
|
|
+// console.log(value3 === value4); // тоже должно быть true
|
|
|
|
+
|
|
|
|
+// const namePrompt = prompt.bind(window, 'Как тебя зовут?');
|
|
|
|
+// const nameSaver = makeSaver(namePrompt);
|
|
|
|
+// alert(`Привет! Prompt еще не было!`);
|
|
|
|
+// alert(
|
|
|
|
+// `Привет ${nameSaver()}. Только что запустился prompt, первый и последний раз`
|
|
|
|
+// );
|
|
|
|
+// alert(`Слушай, ${nameSaver()}, го пить пиво. Ведь prompt был только один раз`);
|
|
|
|
+
|
|
|
|
+//Final Countdown
|
|
|
|
+//Напишите код, который будет делать обратный ежесекундный отсчёт в консоли, используя console.log.
|
|
|
|
+//Используйте Self Invoked Function для создания замыкания и setTimeout для задержки вывода.Результатом должно быть:
|
|
|
|
+// 5 //пауза 1 секунда
|
|
|
|
+4; //пауза 1 секунда
|
|
|
|
+3; //пауза 1 секунда
|
|
|
|
+2; //пауза 1 секунда
|
|
|
|
+1; //пауза 1 секунда
|
|
|
|
+// ('поехали!');
|
|
|
|
+
|
|
|
|
+// (function selfCountDown(n) {
|
|
|
|
+// if (n === 0) return;
|
|
|
|
+// setTimeout(() => {
|
|
|
|
+// console.log(n);
|
|
|
|
+// selfCountDown(n - 1);
|
|
|
|
+// }, 1000);
|
|
|
|
+// })(5);
|
|
|
|
+
|
|
|
|
+//myBind
|
|
|
|
+//Изучите встроенную функцию bind, и сделайте свою версию, которая позволит определить "значение по умолчанию"
|
|
|
|
+//не только для первых параметров, но для любых других, например для степени в Math.pow:
|
|
|
|
+//Массив, который идет третьим параметром определяет, какие поля должны подменяться значением по умолчанию,
|
|
|
|
+//а какие - задаваться в последствии(undefined).
|
|
|
|
+const myBind = function (fnBind, context, settings) {
|
|
|
|
+ return function (...params) {
|
|
|
|
+ let i = 0;
|
|
|
|
+ const array = settings.map((settingsItem) => {
|
|
|
|
+ if (settingsItem === undefined) {
|
|
|
|
+ const paramsItem = params[i];
|
|
|
|
+ i += 1;
|
|
|
|
+ return paramsItem;
|
|
|
|
+ } else {
|
|
|
|
+ return settingsItem;
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ return fnBind(...array);
|
|
|
|
+ };
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+const pow5 = myBind(Math.pow, Math, [undefined, 5]);
|
|
|
|
+const cube = myBind(Math.pow, Math, [undefined, 3]);
|
|
|
|
+console.log(pow5(2)); // => 32, вызывает Math.pow(2,5), соотнесите с [undefined, 5]
|
|
|
|
+console.log(cube(3)); // => 27
|
|
|
|
+// первый параметр - функция для биндинга значений по умолчанию,
|
|
|
|
+// второй - this для этой функции, третий - массив, в котором undefined означает
|
|
|
|
+// параметры, которые должны передаваться при вызове,
|
|
|
|
+// а другие значения являются значениями по умолчанию:
|
|
|
|
+// cube возводит число в куб
|
|
|
|
+
|
|
|
|
+const 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
|
|
|
|
+console.log(chessMin(-1, -5, 3, 15));
|
|
|
|
+
|
|
|
|
+const zeroPrompt = myBind(prompt, window, [undefined, '0']);
|
|
|
|
+// аналогично, только теперь задается "0" как текст по умолчанию в prompt,
|
|
|
|
+// // а текст приглашения пользователя задается при вызове zeroPrompt
|
|
|
|
+const someNumber = zeroPrompt('Введите число'); // вызывает prompt("Введите число","0")
|
|
|
|
+
|
|
|
|
+console.log(
|
|
|
|
+ myBind((...params) => params.join(''), null, [
|
|
|
|
+ undefined,
|
|
|
|
+ 'b',
|
|
|
|
+ undefined,
|
|
|
|
+ undefined,
|
|
|
|
+ 'e',
|
|
|
|
+ 'f',
|
|
|
|
+ ])('a', 'c', 'd') === 'abcdef'
|
|
|
|
+);
|