From a4488a7823026dafcaef48448c5af0ded84fd504 Mon Sep 17 00:00:00 2001 From: "Dmitriy.Yarygin" Date: Mon, 26 Nov 2018 15:16:33 +0200 Subject: [PATCH 1/3] Solutions for function course tasks --- ex1-compose.js | 23 ++++++++++++++++++ ex2-sequence.js | 24 +++++++++++++++++++ ex3-spy.js | 16 +++++++++++++ ex4-calculator.js | 53 +++++++++++++++++++++++++++++++++++++++++ ex5-timeout.js | 60 +++++++++++++++++++++++++++++++++++++++++++++++ ex6.js | 10 ++++++++ 6 files changed, 186 insertions(+) create mode 100644 ex1-compose.js create mode 100644 ex2-sequence.js create mode 100644 ex3-spy.js create mode 100644 ex4-calculator.js create mode 100644 ex5-timeout.js create mode 100644 ex6.js diff --git a/ex1-compose.js b/ex1-compose.js new file mode 100644 index 0000000..4c0e0a4 --- /dev/null +++ b/ex1-compose.js @@ -0,0 +1,23 @@ +// Реализовать композирующую функцию 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 c( msg = new Date().toLocaleString() ){ + console.log(msg); + } + +let foo = compose(c,c,c); +foo('Same argument everywhere'); + + +// Переписать функцию из первого задания чтобы она вызывала каждую функцию с аргументом того что вернула предыдущая функция +function compose2(...functionsArray) { + return (argStart) => functionsArray.reduceRight( (argNext,f) => { return f(argNext) }, argStart); +} + +let foo2 = compose2(c,c,c); +foo2('First argument'); \ No newline at end of file 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..e76f0f3 --- /dev/null +++ b/ex5-timeout.js @@ -0,0 +1,60 @@ +// Реализовать свою функцию 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; + return function () { + clearTimeout(timerId); + timerId = setTimeout(f, delay); + } +} +function c(msg = new Date().toLocaleString()) { + console.log(msg); +} +let timer1 = myTimeoutWrapper(c, 500); +timer1(); +timer1(); +timer1(); + +// Написать функцию которая принимает функцию и количество миллисекунд и возвращает функцию обертку. Каждый раз когда обертка будет вызвана, +// должна вызываться внутренняя функция, НО внутренняя функция не должна быть вызвана если с момента предыдущего вызова не прошло заданное кол-во миллисекунд. +function myTimeoutWrapper2(f, delay) { + let timerId = null; + return function () { + if (timerId === null) { + timerId = setTimeout(() => { f(); timerId = null; }, delay); + } + } +} +let timer2 = myTimeoutWrapper2(c, 500); +timer2(); +timer2(); +timer2(); + 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') +}) From 86b1ffb79bfbeda555737b6a1f9a1e2a32499f60 Mon Sep 17 00:00:00 2001 From: "Dmitriy.Yarygin" Date: Mon, 26 Nov 2018 16:29:37 +0200 Subject: [PATCH 2/3] correct ex1 --- ex1-compose.js | 11 ----------- ex5-timeout.js | 31 ++++++++++++------------------- 2 files changed, 12 insertions(+), 30 deletions(-) diff --git a/ex1-compose.js b/ex1-compose.js index 4c0e0a4..eabdbe0 100644 --- a/ex1-compose.js +++ b/ex1-compose.js @@ -6,18 +6,7 @@ function compose(...functionsArray) { // const isValid = validate(“someemail@emal.com”) -function c( msg = new Date().toLocaleString() ){ - console.log(msg); - } - -let foo = compose(c,c,c); -foo('Same argument everywhere'); - - // Переписать функцию из первого задания чтобы она вызывала каждую функцию с аргументом того что вернула предыдущая функция function compose2(...functionsArray) { return (argStart) => functionsArray.reduceRight( (argNext,f) => { return f(argNext) }, argStart); } - -let foo2 = compose2(c,c,c); -foo2('First argument'); \ No newline at end of file diff --git a/ex5-timeout.js b/ex5-timeout.js index e76f0f3..4921233 100644 --- a/ex5-timeout.js +++ b/ex5-timeout.js @@ -29,32 +29,25 @@ user2.timeoutSayHi("Hello!"); // Написать функцию которая принимает функцию и количество миллисекунд и возвращает функцию обертку. Каждый раз когда обертка будет вызвана, // должна вызываться внутренняя функция, НО внутренняя функция не должна быть вызвана чаще чем раз в переданное кол-во миллисекунд. function myTimeoutWrapper(f, delay) { - let timerId; + let timerId = null; return function () { - clearTimeout(timerId); - timerId = setTimeout(f, delay); + if (timerId === null) { + timerId = setTimeout(() => { f(); timerId = null; }, delay); + } } } -function c(msg = new Date().toLocaleString()) { - console.log(msg); -} -let timer1 = myTimeoutWrapper(c, 500); -timer1(); -timer1(); -timer1(); // Написать функцию которая принимает функцию и количество миллисекунд и возвращает функцию обертку. Каждый раз когда обертка будет вызвана, // должна вызываться внутренняя функция, НО внутренняя функция не должна быть вызвана если с момента предыдущего вызова не прошло заданное кол-во миллисекунд. + function myTimeoutWrapper2(f, delay) { - let timerId = null; + let timersSet = new Set(); return function () { - if (timerId === null) { - timerId = setTimeout(() => { f(); timerId = null; }, delay); + let timerId = setTimeout(() => { f(); timerId = null; }, delay); + if timersSet.has(timerId) { + + } else { + timerId = setTimeout(() => { timerId = null; }, delay); } } -} -let timer2 = myTimeoutWrapper2(c, 500); -timer2(); -timer2(); -timer2(); - +} \ No newline at end of file From bec263d9ccd87d1804604a860bf06da1cc0ed39f Mon Sep 17 00:00:00 2001 From: "Dmitriy.Yarygin" Date: Mon, 26 Nov 2018 17:02:47 +0200 Subject: [PATCH 3/3] correction ex5 --- ex5-timeout.js | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/ex5-timeout.js b/ex5-timeout.js index 4921233..83970c6 100644 --- a/ex5-timeout.js +++ b/ex5-timeout.js @@ -32,22 +32,21 @@ function myTimeoutWrapper(f, delay) { let timerId = null; return function () { if (timerId === null) { - timerId = setTimeout(() => { f(); timerId = null; }, delay); + f(); + } else { + timerId = setTimeout(() => { timerId = null; }, delay); } } } // Написать функцию которая принимает функцию и количество миллисекунд и возвращает функцию обертку. Каждый раз когда обертка будет вызвана, // должна вызываться внутренняя функция, НО внутренняя функция не должна быть вызвана если с момента предыдущего вызова не прошло заданное кол-во миллисекунд. - function myTimeoutWrapper2(f, delay) { - let timersSet = new Set(); + let timerId = null; return function () { - let timerId = setTimeout(() => { f(); timerId = null; }, delay); - if timersSet.has(timerId) { - - } else { - timerId = setTimeout(() => { timerId = null; }, delay); + if (timerId === null) { + f(); } + timerId = setTimeout(() => { timerId = null; }, delay); } } \ No newline at end of file