Изменить параметры связанной функции

1

Учитывая простую функцию:

const a = (x) => (y) => x + y

и его частично применяемая версия:

const b = a(3)

Есть ли способ изменить уже связанный параметр в b? Что-то вроде

b.boundArgs[0] = 5

Так что, если я назову b(5) он вернет 10 а не 8


Немного фона:

Я использую библиотеку, которая возвращает частично прикладную функцию в результате одного из вызовов библиотечных функций.
Я должен изменить первый аргумент (который применяется библиотечной функцией), и я не хочу копировать-вставлять реализацию этой функции. Я бы хотел остаться с библиотекой, за исключением этой небольшой модификации.

  • 0
    Нет, в вашем примере нет способа сделать это.
  • 0
    И где вызывается начальная функция? Вы должны изменить это
Показать ещё 3 комментария
Теги:
function
binding
currying
partial

1 ответ

2
Лучший ответ

Нет, вы не можете этого сделать, если только библиотека, о которой идет речь, делает это возможным. Что это могло, но, вероятно, нет.

В основном то, что вы спрашиваете, - это если вы можете достичь контекста выполнения, функция закрывается и меняет значения переменных (точнее, привязки) в этом контексте. По умолчанию вы не можете. Используя более подробный пример:

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

Я никоим образом не предполагаю, что это хорошая идея, инкапсуляция обычно служит важной цели. Просто указывая, что это возможно сделать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню