根本上应绕开 eval 而非减少其影响:优先用 json.parse 替代 eval 解析数据;需动态执行时用 new function;新建实例改用 obj.constructor;属性访问、模板插值、配置分支均应避免 eval。

根本上不是“减少影响”,而是绕开 eval。它带来的性能损耗是引擎级的放弃优化,无法缓解,只能替代。
用 JSON.parse 替代字符串解析
这是最常见也最该优先替换的场景。很多人用 eval('(' + str + ')') 解析服务端返回的数据,既不安全又慢——比 JSON.parse 慢 8~10 倍,且 V8 会跳过所有 JIT 编译。
- ✅ 直接改写:
const data = JSON.parse(jsonString) - ⚠️ 注意:JSON 格式必须严格(双引号键名、无尾逗号、不含
undefined或函数)。若数据含扩展语法,应统一走预处理清洗,或换用 MessagePack 等结构化协议
用 new Function 替代动态表达式计算
当业务确实需要运行时生成逻辑(如公式引擎、规则配置),new Function 是 eval 的高性能平替:它创建独立作用域,支持参数显式传入,能被 V8 正常内联和 JIT 编译。
- ✅ 示例:
const calc = new Function('a', 'b', 'return a * b + 1');,调用calc(3, 4)返回13 - ⚠️ 切勿拼接用户输入进函数体;应先做白名单校验(如只允许
+-*/().0-9和预设变量名),再构造参数列表
靠 constructor 属性重建实例
想根据已有对象新建同类型实例?别再写 eval(`new ${obj.constructor.name}()`) ——类名可能被压缩、子类继承失效、箭头函数无 constructor,且每次都要重解析字符串。
- ✅ 正确做法:
const newInstance = new obj.constructor(...args) - ✅ 天然支持 class/function 构造器和继承链;TypeScript 下还能配合
InstanceType<typeof obj.constructor></typeof>推导类型 - ⚠️ 若构造函数强制参数,由业务层提供默认值或工厂方法兜底,而非依赖 eval 动态构造
避免属性访问和作用域穿透
动态读取对象字段、拼接变量名、模拟 with 行为……这些本可用更直接的方式实现,却常被误交给 eval。
- ✅ 属性访问:用方括号
obj[key],而非eval(`obj.${key}`) - ✅ 模板插值:用模板字面量
`结果为${x}`,而非拼字符串再 eval - ✅ 配置驱动:把分支逻辑写成策略映射表或 switch-case,而不是把条件判断写成字符串让 eval 执行











