Учитывая простую функцию:
const a = (x) => (y) => x + y
и его частично применяемая версия:
const b = a(3)
Есть ли способ изменить уже связанный параметр в b
? Что-то вроде
b.boundArgs[0] = 5
Так что, если я назову b(5)
он вернет 10
а не 8
Немного фона:
Я использую библиотеку, которая возвращает частично прикладную функцию в результате одного из вызовов библиотечных функций.
Я должен изменить первый аргумент (который применяется библиотечной функцией), и я не хочу копировать-вставлять реализацию этой функции. Я бы хотел остаться с библиотекой, за исключением этой небольшой модификации.
Нет, вы не можете этого сделать, если только библиотека, о которой идет речь, делает это возможным. Что это могло, но, вероятно, нет.
В основном то, что вы спрашиваете, - это если вы можете достичь контекста выполнения, функция закрывается и меняет значения переменных (точнее, привязки) в этом контексте. По умолчанию вы не можете. Используя более подробный пример:
const a = (x) => {
const b = (y) => x + y;
return b;
};
По умолчанию вы ничего не можете сделать с помощью b
который позволяет вам войти и изменить x
в среде b
закрывается.
Раньше я сказал, что библиотека может позволить вам сделать это, но, вероятно, нет. Здесь один из способов:
const a = (x) => {
const b = (y) => x + y;
b.changeX = (newX) => {
x = newX;
};
return b;
};
const b = a(3);
b.changeX(10);
console.log(b(5)); // 15 instead of 8
Вы все еще не можете узнать, что x
привязано к b
, но вы можете изменить его через changeX
.
Или libray может просто использовать свойство для возвращаемой функции:
const a = (x) => {
const b = (y) => b.x + y; // Note b.x
b.x = x; // Initial value
return b;
};
const b = a(3);
b.x = 10;
console.log(b(5)); // 15 instead of 8
Я никоим образом не предполагаю, что это хорошая идея, инкапсуляция обычно служит важной цели. Просто указывая, что это возможно сделать.