如何拦截或编辑JavaScript柯里化函数以修改调用结果?
实现自定义输出的解决方案
看起来你刚接触JavaScript函数式编程,咱们一步步来解决这个问题~
首先,先分析下当前的问题:原来的interceptFunc只是原封不动地返回传入的函数,所以interceptFunc(curryFunc)('func')本质上还是在调用curryFunc('func'),最终执行orgFunc('func','curried')得到"func curried"。要改成输出"func inte...",我们需要让interceptFunc真正起到"拦截"的作用——也就是返回一个新的函数,来修改原函数的行为。
这里有两种简单易懂的实现方式,你可以根据需求选择:
方法1:直接替换原函数的参数
这种方法直接绕过curryFunc里固定的'curried'参数,直接调用orgFunc传入我们想要的第二个参数:
const orgFunc = (str, str2) =>{ return str + ' ' + str2; } const curryFunc = (str) => { return orgFunc(str,'curried'); } // 修改后的interceptFunc const interceptFunc = (fn) => { // 返回一个新的函数,接收str参数 return (str) => { // 直接调用orgFunc,传入自定义的第二个参数'inte...' return orgFunc(str, 'inte...'); }; }; // 测试第三条语句 console.log("interceptFunc", interceptFunc(curryFunc)('func')); // 输出:interceptFunc func inte...
方法2:修改原函数的返回结果
如果想保留原函数的调用逻辑,但修改最终的输出字符串(比如把结果里的curried替换成inte...),可以用这种更灵活的方式:
const orgFunc = (str, str2) =>{ return str + ' ' + str2; } const curryFunc = (str) => { return orgFunc(str,'curried'); } // 修改后的interceptFunc const interceptFunc = (fn) => { // 返回一个包装后的函数,接收所有传入的参数 return (...args) => { // 先调用原函数得到原始结果 const originalResult = fn(...args); // 替换结果中的'curried'为'inte...' return originalResult.replace('curried', 'inte...'); }; }; // 测试第三条语句 console.log("interceptFunc", interceptFunc(curryFunc)('func')); // 输出:interceptFunc func inte...
为什么这样能行?
这用到了函数式编程里的高阶函数概念——interceptFunc是一个接收函数、并返回新函数的函数。通过返回新函数,我们可以在不修改原curryFunc和orgFunc的前提下,拦截并修改它们的行为,这也是函数式编程里常用的技巧哦~
内容的提问来源于stack exchange,提问作者TETTASUN
相关产品推荐
相关产品推荐

