Я импортирую библиотеку с функцией и хотел бы заменить эту функцию на функцию, которая принимает исходную функцию в качестве аргумента вместе с дополнительной функцией.
Исходная функция может быть logThis:
function logThis() {console.log('this'));
Я могу создать новую функцию, которая выполняет logThis, а затем записывает 'that';
function logThisThenThat() {
logThis();
console.log('that');
}
Я хотел бы заменить logThis новой функцией, которая выполняет исходную функцию, а затем другую функцию? Возможно ли это с помощью композиции функций, или мне придется создавать новую функцию с другим именем, которая состоит из исходной функции и дополнительных функций.
Что-то вроде:
logThis = compose(logThis, logThat);
Если вы передадите logThis()
в функцию compose()
, вы будете хранить ссылку на нее в замыкании, поэтому она будет действовать, когда вы logThis()
новый logThis()
. Имя на самом деле не так важно, если вы переименуете его в порядке, который позволяет вам получить ссылку на старый logThis()
прежде чем указывать имя новой функции. Например, правая часть logThis = compose(logThis, logThat)
выполняется перед назначением имени ниже, поэтому вы logThis = compose(logThis, logThat)
на функцию перед переназначением имени:
function logThis() {console.log('this')};
function logThat() {console.log('that')};
let compose = (f1, f2) => () => {
f1()
f2()
}
logThis = compose(logThis, logThat)
logThis()
Вы можете создать такую функцию.
function logThis() {
console.log("this");
}
function logThat() {
console.log("that");
}
let compose = (...func) => ()=> {
let functions = func;
functions.forEach((fn) => fn());
}
logThis = compose(logThis, logThat);
logThis();
Добавив (...func)
качестве параметров, вы можете выполнить 3, 4 любого количества функций, которые вам нравятся/нужны.
Примечание. Отредактируйте фрагмент в соответствии с вопросом. Выбранный ответ @mark-meyer правильный.
Вы можете переопределить существующую функцию новой.
Сохраните копию оригинала, как это...
_logThis = logThis;
... а затем заставьте вашу новую версию назвать оригинальную...
function logThis() {
_logThis();
// your other function call or new code goes here
}
Однако это не очень хорошая идея, так как это изменит то, что происходит для каждого существующего вызова этого метода. С этим нужно обращаться осторожно.
Кроме того, сфера является важным фактором здесь. Это основной пример того, что вы пытаетесь сделать.
let compose = (...fns) => () => fns.forEach(f=>f())