Forráskód Böngészése

done wh n9 closure Omelchienko Hryhorii

unknown 3 éve
szülő
commit
5c22055c0d
1 módosított fájl, 116 hozzáadás és 1 törlés
  1. 116 1
      javascript/hw.js

+ 116 - 1
javascript/hw.js

@@ -1,3 +1,118 @@
 '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'
+);