update js-curry
This commit is contained in:
@@ -14,7 +14,7 @@ let user = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
### «this» не является фиксированным
|
## «this» не является фиксированным
|
||||||
В JavaScript ключевое слово «this» ведёт себя иначе, чем в большинстве других языков программирования. Его можно использовать в любой функции, даже если это не метод объекта.
|
В JavaScript ключевое слово «this» ведёт себя иначе, чем в большинстве других языков программирования. Его можно использовать в любой функции, даже если это не метод объекта.
|
||||||
|
|
||||||
❗ ***Вызов без объекта: this == undefined***
|
❗ ***Вызов без объекта: this == undefined***
|
||||||
@@ -31,7 +31,7 @@ let user = {
|
|||||||
|
|
||||||
Эта концепция вычисления `this` в момент исполнения имеет как свои плюсы, так и минусы. С одной стороны, функция может быть повторно использована в качестве метода у различных объектов (что повышает гибкость).
|
Эта концепция вычисления `this` в момент исполнения имеет как свои плюсы, так и минусы. С одной стороны, функция может быть повторно использована в качестве метода у различных объектов (что повышает гибкость).
|
||||||
|
|
||||||
### У стрелочных функций нет «this»
|
## У стрелочных функций нет «this»
|
||||||
Стрелочные функции особенные: у них нет своего «собственного» `this`. Если мы ссылаемся на `this` внутри такой функции, то оно берётся из внешней «нормальной» функции.
|
Стрелочные функции особенные: у них нет своего «собственного» `this`. Если мы ссылаемся на `this` внутри такой функции, то оно берётся из внешней «нормальной» функции.
|
||||||
|
|
||||||
1. Методы могут ссылаться на объект через `this`.
|
1. Методы могут ссылаться на объект через `this`.
|
||||||
@@ -40,3 +40,4 @@ let user = {
|
|||||||
- Когда функция вызывается синтаксисом «метода» – ***object.method()***, значением `this` во время вызова является `object`.
|
- Когда функция вызывается синтаксисом «метода» – ***object.method()***, значением `this` во время вызова является `object`.
|
||||||
|
|
||||||
🚀 **Источник: [https://learn.javascript.ru/object-methods](https://learn.javascript.ru/object-methods)**
|
🚀 **Источник: [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)**
|
||||||
78
docs/javascript/04-functions/12-currying.md
Normal file
78
docs/javascript/04-functions/12-currying.md
Normal file
@@ -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)**
|
||||||
Reference in New Issue
Block a user