如何通过对象动态设置JavaScript函数及对应参数?
动态调用带可变参数函数的解决方案
你可以通过函数映射表实现这种动态调用,把每个Card对应的函数和参数传递逻辑配置在一个对象里,根据Card值匹配后执行即可。下面是具体实现:
方法一:封装函数与参数生成逻辑
// 先定义业务函数 function recruitCarpenter(G, player) { // 你的函数逻辑 } function shipBallista(G, currentPlayer, opponent, attackMultiplier) { // 你的函数逻辑 } // 创建Card到执行逻辑的映射表 const cardActionMap = { recruitCarpenter: { execute: (G, ctx) => recruitCarpenter(G, ctx.currentPlayer) }, shipBallista: { execute: (G, ctx) => shipBallista(G, ctx.currentPlayer, G.opponent, G.attackMultiplier) } }; // 动态调用流程 const currentCard = "recruitCarpenter"; // 替换为你的实际Card变量 const action = cardActionMap[currentCard]; if (action) { action.execute(G, ctx); } else { console.warn(`未定义Card:${currentCard}的处理逻辑`); }
你之前报错的原因
如果之前直接用对象存储静态参数,大概率是提前读取了G或ctx的属性(比如ctx.currentPlayer),但当时这些属性还未初始化,或者后续值更新后参数没同步,导致出现undefined引用错误。用函数封装参数传递逻辑,能确保每次调用时才去读取最新的有效属性值。
方法二:简化版映射表
如果参数逻辑简单,还可以直接把调用逻辑写在映射表的函数里,更简洁:
const cardActionMap = { recruitCarpenter: (G, ctx) => recruitCarpenter(G, ctx.currentPlayer), shipBallista: (G, ctx) => shipBallista(G, ctx.currentPlayer, G.opponent, G.attackMultiplier) }; // 调用时 const currentCard = "shipBallista"; const action = cardActionMap[currentCard]; if (action) { action(G, ctx); }
注意事项
- 必须先判断
cardActionMap[currentCard]是否存在,避免调用undefined引发新错误 - 如果
G或ctx本身可能为undefined,调用前要加合法性校验,比如if (G && ctx && action)
内容的提问来源于stack exchange,提问作者evilgenious448
相关产品推荐
相关产品推荐

