如何用 Function 构造函数动态创建并执行一段代码

张开发
2026/6/6 1:11:57 15 分钟阅读
如何用 Function 构造函数动态创建并执行一段代码
Function构造函数不是eval的安全替代品它执行字符串代码且作用域全局无法访问词法作用域需显式传入所有依赖参数易致注入风险与隐蔽错误。Function 构造函数能执行字符串代码但不是 eval 的安全替代品它确实可以动态生成函数并执行字符串形式的代码但和 eval 一样只要输入不可控就存在代码注入风险。别因为语法看着“新”就误以为更安全——Function 创建的函数作用域是全局的闭包隔离能力为零。常见错误现象ReferenceError: x is not defined当你试图在构造函数里引用外层变量却没显式传参时或者更隐蔽的函数体里用了 this结果指向 window浏览器或 globalThisNode而非你预期的对象。必须把所有依赖变量都作为参数名显式列出不能靠作用域链自动捕获构造函数签名是 new Function([arg1, arg2, ...,] functionBody)参数名是字符串函数体也是字符串不支持访问当前词法作用域连 const 声明的变量都拿不到除非你手动传进去Function 构造函数 vs eval执行时机和作用域差异eval 是立即执行、作用域紧贴调用位置Function 是先编译成函数对象再调用作用域永远是全局。这意味着你在某个模块里用 Function它根本看不到模块内的 import 或 const 变量。使用场景有限典型的是插件系统中预编译表达式比如公式引擎或 SSR 中动态拼接渲染逻辑——但前提是输入完全可信且你明确需要“脱离当前作用域”的隔离性虽然这隔离很弱。eval(console.log(x)) 能访问当前作用域的 xnew Function(console.log(x))() 会报错除非 x 是全局变量new Function(x, console.log(x))(42) 才是正确用法参数名和实参必须一一对应参数传入不匹配导致静默失败或意外行为参数名列表和实际传参数量不一致时不会报错而是按 JavaScript 函数默认规则处理多出的参数被忽略缺少的参数变成 undefined。这种“宽容”容易掩盖逻辑 bug。 Mokker AI AI产品图添加背景

更多文章