diff --git a/ex1-compose.js b/ex1-compose.js new file mode 100644 index 0000000..eabdbe0 --- /dev/null +++ b/ex1-compose.js @@ -0,0 +1,12 @@ +// Реализовать композирующую функцию compose которая будет принимать неограниченное количество функций и вызывать их справа налево +function compose(...functionsArray) { + return (arg) => functionsArray.reduceRight( (temp,f) => { f(arg) }, 0); +} +// const validator = сompose(isEmail, maxLength(5)); +// const isValid = validate(“someemail@emal.com”) + + +// Переписать функцию из первого задания чтобы она вызывала каждую функцию с аргументом того что вернула предыдущая функция +function compose2(...functionsArray) { + return (argStart) => functionsArray.reduceRight( (argNext,f) => { return f(argNext) }, argStart); +} diff --git a/ex2-sequence.js b/ex2-sequence.js new file mode 100644 index 0000000..08e4953 --- /dev/null +++ b/ex2-sequence.js @@ -0,0 +1,24 @@ + +// Напиши функцию создания генератора sequence(start, step). Она при вызове возвращает другую функцию-генератор, которая при каждом вызове дает число на 1 больше, и так до бесконечности. Начальное число, с которого начинать отсчет, и шаг, задается при создании генератора. Шаг можно не указывать, тогда он будет равен одному. Начальное значение по умолчанию равно 0. Генераторов можно создать сколько угодно +function sequence(start, step) { + f.count = start; + f.step = step; + function f() { + let res = f.count; + f.count += f.step; + return res; + } + return f; +} + const generator = sequence(10, 3); + const generator2 = sequence(7, 1); + + console.log(generator()); // 10 + console.log(generator()); // 13 + + console.log(generator2()); // 7 + + console.log(generator()); // 16 + + console.log(generator2()); // 8 + diff --git a/ex3-spy.js b/ex3-spy.js new file mode 100644 index 0000000..f1d44eb --- /dev/null +++ b/ex3-spy.js @@ -0,0 +1,16 @@ +// Реализовать функцию шпиона которая будет сохранять количество вызовов функции +function makeSpyOn(f) { + counter.calls = 0; + function counter() { + counter.calls++; + f(); + } + return counter; +} +function c(msg = new Date().toLocaleString()) { + console.log(msg); +} +const spy = makeSpyOn(c) +spy() +spy() +console.log(spy.calls) // 2 \ No newline at end of file diff --git a/ex4-calculator.js b/ex4-calculator.js new file mode 100644 index 0000000..734e980 --- /dev/null +++ b/ex4-calculator.js @@ -0,0 +1,53 @@ + +// Реализовать объект калькулятор у которого есть методы input, sum, mul, sub (ввод данных, сумма, умножение и вычитание). input должен вызывать ввод 2 цифр от пользователя через prompt и сохранять в себе. Остальные методы должны производить над цифрами соответствующие операции +let calculator = { + input: function () { + this.a = +prompt('Enter value A', 1); + this.b = +prompt('Enter value B', 2); + }, + sum: function () { + let res = this.a + this.b + console.log(res) + return res; + }, + mul: function () { + let res = this.a * this.b + console.log(res) + return res; + }, + sub: function () { + let res = this.a - this.b + console.log(res) + return res; + } +} + +calculator.input(); +calculator.sum(); + +// Реализовать другой калькулятор который не запрашивает данные, а работает с цепочкой вызовов +let calculator2 = { + res: 0, + input: function (x) { + this.res = x; + console.log(this.res); + return this; + }, + sum: function (x) { + this.res += x; + console.log(this.res); + return this; + }, + mul: function (x) { + this.res *= x; + console.log(this.res); + return this; + }, + sub: function (x) { + this.res -= x; + console.log(this.res); + return this; + } +} + +calculator2.input(1).sum(2).mul(3).sub(4) \ No newline at end of file diff --git a/ex5-timeout.js b/ex5-timeout.js new file mode 100644 index 0000000..83970c6 --- /dev/null +++ b/ex5-timeout.js @@ -0,0 +1,52 @@ +// Реализовать свою функцию setTimeout которая бы не потеряла контекст вызова +var user = { + name: "John Smith", + sayHi: function () { + console.log(this.name) + }, + timeoutSayHi: function () { + setTimeout(this.sayHi.call(this), 1000); + } +}; +user.timeoutSayHi(); + +// Сделать возможность дополнительно передать массив аргументов для вызываемой функции +var user2 = { + name: "John Smith", + sayHi: function (msg = this.name) { + console.log(msg) + }, + timeoutSayHi: function (...args) { + myTimeout(this, this.sayHi, args, 1000); + } +}; +function myTimeout(context, f, args, delay) { + setTimeout(f.apply(context, args), delay); +} + +user2.timeoutSayHi("Hello!"); + +// Написать функцию которая принимает функцию и количество миллисекунд и возвращает функцию обертку. Каждый раз когда обертка будет вызвана, +// должна вызываться внутренняя функция, НО внутренняя функция не должна быть вызвана чаще чем раз в переданное кол-во миллисекунд. +function myTimeoutWrapper(f, delay) { + let timerId = null; + return function () { + if (timerId === null) { + f(); + } else { + timerId = setTimeout(() => { timerId = null; }, delay); + } + } +} + +// Написать функцию которая принимает функцию и количество миллисекунд и возвращает функцию обертку. Каждый раз когда обертка будет вызвана, +// должна вызываться внутренняя функция, НО внутренняя функция не должна быть вызвана если с момента предыдущего вызова не прошло заданное кол-во миллисекунд. +function myTimeoutWrapper2(f, delay) { + let timerId = null; + return function () { + if (timerId === null) { + f(); + } + timerId = setTimeout(() => { timerId = null; }, delay); + } +} \ No newline at end of file diff --git a/ex6.js b/ex6.js new file mode 100644 index 0000000..e7f6bd1 --- /dev/null +++ b/ex6.js @@ -0,0 +1,10 @@ +// Написать свою систему модулей которая позволит инкапсулировать локальное состояние. +const module = createModule('module',() => { + return { + sayHi: () => alert('HI') + } +}) + +const anotherModule = createModule('newModule', () => { + const myFirstModule = require('module') +})