diff --git a/docs/javascript/02-objects/03-methods-this.md b/docs/javascript/02-objects/03-methods-this.md index 3bc62a5..056db66 100644 --- a/docs/javascript/02-objects/03-methods-this.md +++ b/docs/javascript/02-objects/03-methods-this.md @@ -14,7 +14,7 @@ let user = { } }; ``` -### «this» не является фиксированным +## «this» не является фиксированным В JavaScript ключевое слово «this» ведёт себя иначе, чем в большинстве других языков программирования. Его можно использовать в любой функции, даже если это не метод объекта. ❗ ***Вызов без объекта: this == undefined*** @@ -31,7 +31,7 @@ let user = { Эта концепция вычисления `this` в момент исполнения имеет как свои плюсы, так и минусы. С одной стороны, функция может быть повторно использована в качестве метода у различных объектов (что повышает гибкость). -### У стрелочных функций нет «this» +## У стрелочных функций нет «this» Стрелочные функции особенные: у них нет своего «собственного» `this`. Если мы ссылаемся на `this` внутри такой функции, то оно берётся из внешней «нормальной» функции. 1. Методы могут ссылаться на объект через `this`. @@ -39,4 +39,5 @@ let user = { - При объявлении любой функции в ней можно использовать `this`, но этот `this` не имеет значения до тех пор, пока функция не будет вызвана. - Когда функция вызывается синтаксисом «метода» – ***object.method()***, значением `this` во время вызова является `object`. -🚀 **Источник: [https://learn.javascript.ru/object-methods](https://learn.javascript.ru/object-methods)** \ No newline at end of file +🚀 **Источник: [https://learn.javascript.ru/object-methods](https://learn.javascript.ru/object-methods)** +🚀 **Доп. источник [https://www.youtube.com/watch?v=aFxQvCqrUC0](https://www.youtube.com/watch?v=aFxQvCqrUC0)** \ No newline at end of file diff --git a/docs/javascript/04-functions/12-currying.md b/docs/javascript/04-functions/12-currying.md new file mode 100644 index 0000000..7698727 --- /dev/null +++ b/docs/javascript/04-functions/12-currying.md @@ -0,0 +1,78 @@ +--- +sidebar_position: 12 +--- + +# Каррирование (currying) + +**Каррирование (currying)** в JavaScript — это процесс преобразования функции с несколькими аргументами в последовательность функций, каждая из которых принимает только один аргумент. + +Каррирование – это трансформация функций таким образом, чтобы они принимали аргументы не как `f(a, b, c)`, а как `f(a)(b)(c)`.\ +Каррирование не вызывает функцию. Оно просто трансформирует её.\ +Делает код более декларативным и удобным для переиспользования. + +## Основная идея: + +Вместо: +```js +function sum(a, b, c) { + return a + b + c; +} +sum(1, 2, 3); // 6 +``` +После каррирования: +```js +function curriedSum(a) { + return function(b) { + return function(c) { + return a + b + c; + }; + }; +} +curriedSum(1)(2)(3); // 6 +``` + +## Зачем нужно каррирование? + +1. **Частичное применение** — можно фиксировать часть аргументов и получать новую функцию: +```js +const addTwo = curriedSum(1)(2); +addTwo(3); // 6 +addTwo(5); // 8 +``` +2. **Удобство композиции функций** — каррированные функции легче комбинировать. +3. **Чистые функции** — каррирование часто используется в функциональном программировании. + +## Автоматическое каррирование (с помощью утилит): + +Можно написать вспомогательную функцию: + +```js +function curry(fn) { + return function curried(...args) { + if (args.length >= fn.length) { + return fn.apply(this, args); + } else { + return function(...args2) { + return curried.apply(this, args.concat(args2)); + }; + } + }; +} + +const curriedSum = curry(sum); +curriedSum(1)(2)(3); // 6 +curriedSum(1, 2)(3); // 6 +``` + +🔹 Пример из реального мира (React + Redux): +```js +const connect = (mapStateToProps) => (mapDispatchToProps) => (Component) => { + // логика подключения компонента + console.log(); +}); +// Использование: +connect(mapState)(mapDispatch)(MyComponent); +``` + +🚀 **_Источник: DeepSeek_** \ +🚀 **Источник: [https://learn.javascript.ru/currying-partials](https://learn.javascript.ru/currying-partials)** \ No newline at end of file