Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions ex1-compose.js
Original file line number Diff line number Diff line change
@@ -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);
}
24 changes: 24 additions & 0 deletions ex2-sequence.js
Original file line number Diff line number Diff line change
@@ -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);

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why indent here?

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

16 changes: 16 additions & 0 deletions ex3-spy.js
Original file line number Diff line number Diff line change
@@ -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
53 changes: 53 additions & 0 deletions ex4-calculator.js
Original file line number Diff line number Diff line change
@@ -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)
52 changes: 52 additions & 0 deletions ex5-timeout.js
Original file line number Diff line number Diff line change
@@ -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);
}
}
10 changes: 10 additions & 0 deletions ex6.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// Написать свою систему модулей которая позволит инкапсулировать локальное состояние.
const module = createModule('module',() => {
return {
sayHi: () => alert('HI')
}
})

const anotherModule = createModule('newModule', () => {
const myFirstModule = require('module')
})