You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将HTML输入的箭头函数字符串转为函数添加到JavaScript/TypeScript数组

解决方案

直接转换字符串为函数(仅适合内部使用场景)

该方案可以直接把用户输入的函数字符串转为可执行函数,但存在严重的XSS代码注入风险,仅推荐应用无外部用户、仅内部人员使用的场景下使用。
转换可以通过eval或者Function构造函数实现,示例代码如下:

// 新增函数的点击事件处理逻辑
addFunction(inputStr: string): void {
  // 可选:提前做格式校验,过滤非法输入
  const funcReg = /^\s*\(\s*\)\s*=>\s*\w+\s*\([\w,\s]*\)\s*$/;
  if (!funcReg.test(inputStr)) {
    alert('输入格式非法,请遵循 () => 函数名(参数1,参数2) 的格式');
    return;
  }
  try {
    // 转换字符串为函数
    const parsedFunc = eval(inputStr);
    // 运行时校验转换结果是否为函数
    if (typeof parsedFunc === 'function') {
      this.functionlist.push(parsedFunc);
    }
  } catch (err) {
    alert('函数解析失败:' + (err as Error).message);
  }
}

注意:转换生成的函数依赖的目标函数(比如示例中的functionC)、参数变量(比如parameterE)必须在eval执行的作用域下可访问,否则会抛出未定义错误。

生产环境推荐替代方案

如果你的应用面向外部用户,绝对不能直接执行用户输入的任意代码,建议采用结构化输入+白名单的方案实现需求,完全规避代码注入风险:

  1. 预先定义允许调用的函数白名单
// 把允许用户调用的函数提前注册到白名单中
const ALLOWED_FUNCS = {
  functionA: functionA,
  functionB: functionB,
  functionC: functionC
} as const;
// 给函数列表加明确的TS类型标注
functionlist: Array<() => void> = [
  () => ALLOWED_FUNCS.functionA(parameterA, parameterB),
  () => ALLOWED_FUNCS.functionB(parameterC, parameterD)
];
  1. 把页面输入框改为结构化输入项:
  • 下拉选择框:选项为白名单里的函数名,用户只能选择允许调用的函数
  • 参数输入区域:支持用户输入对应函数需要的参数
  1. 新增函数逻辑改为自行拼装箭头函数
addNewFunction(funcName: keyof typeof ALLOWED_FUNCS, params: any[]): void {
  this.functionlist.push(() => ALLOWED_FUNCS[funcName](...params));
}

该方案所有可执行逻辑都在你的控制范围内,不会出现恶意代码执行问题,同时也可以利用TypeScript做编译时类型校验,避免非法函数调用。

内容的提问来源于stack exchange,提问作者Artemis J

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 05:57:02