Композиция функций: Дополнение существующей функции дополнительной функцией в Javascript - PullRequest
0 голосов
/ 09 января 2019

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

Исходная функция может быть logThis:

function logThis() {console.log('this'));

Я могу создать новую функцию, которая выполняет logThis, а затем записывает 'that';

function logThisThenThat() {
  logThis();
  console.log('that');
}

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

Что-то вроде:

logThis = compose(logThis, logThat);

Ответы [ 3 ]

0 голосов
/ 09 января 2019

Если вы передадите logThis() в свою функцию compose(), вы будете хранить ссылку на нее в закрытии, поэтому она будет действовать, когда вы создадите новый logThis(). Имя на самом деле не так важно, если вы переименуете его в порядке, который позволит вам получить ссылку на старый logThis(), прежде чем указывать имя новой функции. Например, правая часть 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()
0 голосов
/ 09 января 2019

Вы можете создать такую ​​функцию.

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 правильный.

0 голосов
/ 09 января 2019

Вы можете переопределить существующую функцию новой.

Храните копию оригинала, как это ...

_logThis = logThis;

... и затем заставьте вашу новую версию назвать оригинальную ...

function logThis() {
    _logThis();
    // your other function call or new code goes here
}

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

Кроме того, здесь важен масштаб. Это основной пример того, что вы пытаетесь сделать.

...