|
@@ -0,0 +1,123 @@
|
|
|
+// 1. makeProfileTimer +
|
|
|
+// Напишите функцию makeProfileTimer, которая служит для замера времени выполнения другого кода и работает следующим образом:
|
|
|
+
|
|
|
+// {
|
|
|
+// let time = performance.now();
|
|
|
+// alert('Замеряем время работы этого alert');
|
|
|
+// time = performance.now() - time;
|
|
|
+// alert(`Время выполнения ${time}`)
|
|
|
+// }
|
|
|
+
|
|
|
+// {
|
|
|
+// function makeProfileTimer () {
|
|
|
+// let t0 = performance.now();
|
|
|
+// alert('Замеряем время работы этого alert');
|
|
|
+// let t1 = performance.now();
|
|
|
+// return function () {
|
|
|
+// return `Время работы этого alert ${t1-t0}`
|
|
|
+// }
|
|
|
+// }
|
|
|
+//
|
|
|
+// let timer = makeProfileTimer()
|
|
|
+// alert(timer())
|
|
|
+// }
|
|
|
+
|
|
|
+//2. makeSaver
|
|
|
+// Напишите функцию makeSaver, которая:
|
|
|
+
|
|
|
+//Таким образом makeSaver решает две задачи:
|
|
|
+//
|
|
|
+// Навсегда сохраняет результат функции. Это актуально, например, для Math.random.
|
|
|
+// Действует лениво, то есть вызывает Math.random только тогда, когда результат действительно нужен. Если же по
|
|
|
+// каким-то причинам значение не понадобится, то Math.random даже не будет вызван
|
|
|
+
|
|
|
+// function makeSaver (fn) {
|
|
|
+// return function bind () {
|
|
|
+// return fn;
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+//let saver = makeSaver(Math.random)
|
|
|
+
|
|
|
+// let value1 = saver();
|
|
|
+// let value2 = saver();
|
|
|
+// console.log(value1())
|
|
|
+// console.log(value2())
|
|
|
+// console.log(value1 === value2)
|
|
|
+// ----------------------------------------------------
|
|
|
+// let saver2 = makeSaver(() => console.log('saved function called') || [null, undefined, false, '', 0, Math.random()][Math.ceil(Math.random()*6)])
|
|
|
+// let value3 = saver2();
|
|
|
+// let value4 = saver2();
|
|
|
+// console.log(value3())
|
|
|
+// console.log(value4())
|
|
|
+// console.log(value3 === value4)
|
|
|
+// ------------------------------------------------------------
|
|
|
+
|
|
|
+function makeSaver () {
|
|
|
+ return function bind() {
|
|
|
+ return name;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+let namePrompt = prompt.bind(window, 'Как тебя зовут?');
|
|
|
+let nameSaver = makeSaver(namePrompt)
|
|
|
+alert(`Привет! Prompt еще не было!`)
|
|
|
+alert(`Привет ${nameSaver()}. Только что запустился prompt, первый и последний раз`)
|
|
|
+alert(`Слушай, ${nameSaver()}, го пить пиво. Ведь prompt был только один раз`)
|
|
|
+
|
|
|
+//3. myBind +
|
|
|
+// Изучите встроенную функцию bind, и сделайте свою версию, которая позволит определить "значение по умолчанию" не
|
|
|
+// только для первых параметров, но для любых других, например для степени в Math.pow:
|
|
|
+// {
|
|
|
+// function myBind (func, place, parametr) {
|
|
|
+// function wrapper () {
|
|
|
+// let args = Object.assign(parametr, arguments);
|
|
|
+// return func.apply(place, args);
|
|
|
+// }
|
|
|
+// return wrapper;
|
|
|
+// }
|
|
|
+//
|
|
|
+// let pow5 = myBind(Math.pow, Math, [, 5])
|
|
|
+// console.log(pow5(2))
|
|
|
+//
|
|
|
+// let cube = myBind(Math.pow, Math, [, 3]);
|
|
|
+// console.log(cube(3))
|
|
|
+//
|
|
|
+// let zeroPrompt = myBind(prompt, window, [undefined, '0'])
|
|
|
+// let someNumber = zeroPrompt("Введите число");
|
|
|
+// alert(someNumber)
|
|
|
+//
|
|
|
+// let chessMin = myBind(Math.min, Math, [ 4, 5, 8, 9]);
|
|
|
+// console.log(chessMin(-1,-10,3,15))
|
|
|
+//
|
|
|
+// const bindedJoiner = myBind((...params) => params.join(''), null, [ ,'b', , ,'e','f'])
|
|
|
+// console.log(bindedJoiner('a','c','d'))
|
|
|
+//}
|
|
|
+
|
|
|
+
|
|
|
+//4. checkResult
|
|
|
+// Напишите декоратор checkResult, который:
|
|
|
+//
|
|
|
+// принимает функцию для запуска и проверки результата (оригинал)
|
|
|
+// принимает функцию для проверки результата (валидатор)
|
|
|
+// возвращает обертку, которая запускает оригинал до тех пор, пока оригинал не вернет значение, удовлетворяющее
|
|
|
+// функции-валидатору. В валидатор передается результат оригинальной функции. Если валидатор возвращает true, то
|
|
|
+// обертка возвращает результат оригинальной функции. Если валидатор возвращает что-то другое, то оригинал
|
|
|
+// запускается еще, пока валидатор не вернет true.
|
|
|
+
|
|
|
+// function checkResult (original, validator) {
|
|
|
+// function wrapper(...params){
|
|
|
+//
|
|
|
+// }
|
|
|
+// return wrapper
|
|
|
+// }
|
|
|
+//
|
|
|
+//
|
|
|
+// //numberPrompt - это функция, которая будет запускать prompt до тех пор, пока пользователь не введет число
|
|
|
+// const numberPrompt = checkResult(prompt, x => !isNaN(+x))
|
|
|
+// let number = +numberPrompt("Введите число", "0") //параметры передаются насквозь в оригинал. Не забудьте передать this, используя call или apply
|
|
|
+//
|
|
|
+// //gamePrompt - это функция, которая будет запускать prompt до тех пор, пока пользователь не введет одно из слов 'камень', 'ножницы', 'бумага'
|
|
|
+// const gamePrompt = checkResult(prompt, x => ['камень', 'ножницы', 'бумага'].includes(x.toLowerCase()))
|
|
|
+// const turn = gamePrompt("Введите что то из списка: 'камень', 'ножницы', 'бумага'")
|
|
|
+//
|