函数组成:用Javascript中的附加功能增强现有功能

时间:2019-01-09 15:31:17

标签: javascript function-composition

我导入了一个带有函数的库,并希望将该函数替换为以原始函数为参数以及附加函数的函数。

原始功能可能是logThis:

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

我可以创建一个新函数,该函数执行logThis然后记录“ that”;

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

我想用一个执行原始功能的新功能替换logThis,然后执行另一个功能?函数组合是否可行?还是我必须创建一个具有不同名称的新函数,该函数由原始函数和其他函数组成。

类似的东西:

logThis = compose(logThis, logThat);

3 个答案:

答案 0 :(得分:1)

您可以使用新功能覆盖现有功能。

像这样保留原件的副本...

_logThis = logThis;

...然后将您的新版本称为原始版本...

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

但这并不是一个特别好的主意,因为这会修改对该方法的每个现有调用所发生的情况。这需要小心处理。

此外,范围在这里也很重要。这是您要执行的操作的基本示例。

答案 1 :(得分:1)

如果将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()

答案 2 :(得分:1)

您可以创建这样的函数。

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的selected answer是正确的。