JavaScript中没有newFunction构造函数,实际是Function构造函数支持运行时以字符串动态创建函数,其参数和函数体均为字符串,生成的函数在全局作用域执行且无闭包。

JavaScript 中没有 newFunction 这个内置构造函数,你可能指的是通过 Function 构造函数动态创建函数的方式——这是 JavaScript 唯一原生支持的、在运行时以字符串形式生成并执行函数的方法。
Function 构造函数的基本用法
Function 是一个内建构造函数,允许你传入参数名和函数体字符串,动态生成新函数。它与 eval 或函数表达式不同,生成的函数在全局作用域中创建(不捕获外层词法环境)。
- 语法:
new Function([arg1, arg2, ...,] functionBody) - 参数名必须是字符串,函数体也必须是字符串
- 所有参数(包括最后一个)都是字符串类型,最后一个为函数体
例如:
const add = new Function('a', 'b', 'return a + b');console.log(add(2, 3)); // 5
与普通函数声明/表达式的本质区别
动态创建的函数无法访问定义时的外部变量(即没有闭包),它的作用域链只包含全局对象和自身局部变量。
立即学习“Java免费学习笔记(深入)”;
- ❌ 不会捕获外层 let/const 变量或函数参数
- ✅ 所有代码在全局作用域中解析,类似
eval但更受限、更安全(不访问当前作用域) - ⚠️ 性能较差,且存在潜在安全风险(如拼接不可信字符串)
对比示例:
const x = 10;const f1 = () => x + 1; // 可访问外层 x
const f2 = new Function('return x + 1'); // 报错:x is not defined(除非全局有 x)
实际可用的动态场景
虽然不推荐日常使用,但在特定工程场景中仍有价值:
- 模板引擎编译(如早期的 Handlebars、ejs 的部分实现)
- 沙箱环境中的受限逻辑注入(配合严格输入校验)
- 配置驱动的简单计算逻辑(如表单校验规则、公式字段)
- 调试工具中即时执行用户输入的 JS 表达式
注意:务必对 functionBody 字符串做白名单过滤或 AST 校验,禁止直接拼接用户输入。
替代方案建议
大多数需要“动态函数”的需求,其实有更安全、更可维护的替代方式:
- 用对象映射代替字符串解析:
{ add: (a,b) => a+b, multiply: (a,b) => a*b } - 用
switch或策略模式分发逻辑 - 借助
eval(仅限可信上下文,且仍不如 Function 安全) - 现代方案:WebAssembly、插件化架构、JSON Schema + 解释器
除非明确需要运行时字符串编译,否则优先避开 Function 构造函数。










