JavaScript高阶函数如何条件生成函数 避免重复代码与冗余判断
解决方案
核心思路是拆分环境差异逻辑和通用业务逻辑:所有环境判断、环境相关的取值/方法绑定,全部放在高阶函数执行阶段完成(整个代码生命周期仅执行1次),最终返回的业务函数直接引用提前确定好的差异内容,既不需要每次调用时重复判断,也不会出现通用逻辑重复编写的问题。
基础实现
对于简单场景,直接在高阶函数内先完成环境判断,把差异值/差异方法提前计算、绑定为局部常量,返回的函数直接引用这些常量即可,内部不需要写任何条件分支:
function genFunction1(env){ // 以下判断仅在生成函数时执行1次 const returnVal = env === "env1" ? 3 : 2; // 通用逻辑仅编写1次,无任何条件判断 return function () { return returnVal; } }
如果差异部分是逻辑而非固定值,同样可以在生成阶段绑定对应环境的实现方法:
function genBroadcastFunc(env) { // 差异方法仅在生成时绑定1次 const sendMessage = env === "env1" ? (content) => Maptool.chat.broadcast(content) : (content) => console.log(content); const msgPrefix = env === "env1" ? "[Maptool]" : "[Console]"; // 通用逻辑统一编写,不需要判断环境 return function(msg) { const fullContent = `${msgPrefix} ${msg}`; console.log("send log:", fullContent); sendMessage(fullContent); } }
多函数场景优化
如果需要生成大量跨环境通用的业务函数,可以把环境检测、适配层初始化的逻辑提前到全局只执行1次,后续所有业务函数直接复用已经初始化完成的适配配置,不需要每个生成函数都重复写环境判断:
// 全局仅执行1次环境检测,生成完整适配层 const envAdapter = (() => { try { Maptool.chat.broadcast(""); return { envTag: "env1", broadcast: (content) => Maptool.chat.broadcast(content), baseValue: 3 }; } catch(e) { if(e instanceof ReferenceError) { return { envTag: "env2", broadcast: (content) => console.log(content), baseValue: 2 }; } throw e; } })(); // 后续所有业务函数生成时,直接取适配层的固定内容即可 function genFunction1() { const val = envAdapter.baseValue; return function() { return val; } } function genBroadcastFunc() { const send = envAdapter.broadcast; const prefix = `[${envAdapter.envTag}]`; return function(msg) { send(`${prefix} ${msg}`); } }
原第二种写法重复触发判断的原因
你之前把obj.env的读取判断写在了返回的内层函数中,只有每次调用内层函数时才会执行属性读取逻辑,因此会重复触发getter。只要把所有环境判断、属性读取的逻辑移到高阶函数的外层作用域(即生成函数的阶段执行),内层函数仅持有已经计算完成的常量/方法引用,就可以完全避免重复判断的开销。
内容的提问来源于stack exchange,提问作者ether
相关产品推荐
相关产品推荐

