eval 是 JavaScript 中高危函数,将字符串作为代码执行,易导致 XSS、性能差、调试难、作用域混乱;应禁用,改用 JSON.parse、方括号访问、Reflect.apply 等安全替代方案。
eval 是 JavaScript 中一个内置函数,作用是把传入的字符串当作 JavaScript 代码来解析并执行。
比如你有字符串
"2 + 3 * 4",用 eval("2 + 3 * 4") 就会返回 14;再比如动态拼接变量名或函数调用:eval("obj." + key)、eval(funcName + "()")。看起来很灵活,尤其在老代码或某些“动态执行”场景里出现过。
主要问题不是“功能弱”,而是风险高、性能差、可维护性极低:
eval("alert('xss'); fetch('/api/delete?user='+user)"),直接导致 XSS 或数据泄露。eval 内容几乎不做编译优化,也无法做静态分析、压缩、语法检查,调试时也看不到原始位置,堆栈信息混乱。eval,它仍可能访问和修改外层变量,行为难以预测;而 Function 构造器虽然也有风险,但至少作用域更干净。JSON.parse;动态属性访问用方括号 obj[key];动态函数调用可用 obj[funcName]?.() 或 Reflect.apply;配置驱动逻辑可用查表法或策略模式。几乎没有真正安全且不可替代的场景。即使测试、沙箱、DSL 解析等需求,也应优先考虑 Function 构造器(仍需严格校验字符串)、Web Worker 隔离,或专用解析器(如 acorn、esprima)。Node.js 中的 vm 模块虽提供沙箱,但配置复杂、性能损耗大,也不推荐轻易使用。
不复杂但容易忽略:只要字符串内容不完全由开发者静态控制,就别碰 eval。