function构造函数通过字符串动态创建函数,仅访问全局作用域、无闭包、有注入风险,适用于配置驱动逻辑或沙箱执行等特殊场景,日常开发应优先选用函数表达式或高阶函数。

JavaScript 中用 Function 构造函数动态创建函数,核心是把参数名和函数体作为字符串传入,由引擎在运行时解析并生成新函数。它不依赖当前作用域,也不形成闭包,适合极少数需要“代码即数据”的场景。
基本语法与写法
Function 构造函数接受任意数量的字符串参数,**最后一个为函数体,其余均为形参名**:
-
new Function('a', 'b', 'return a + b')→ 生成接受两个参数、返回和的函数 -
new Function('console.log("hello")')→ 无参函数,执行后打印 hello - 参数名可以为空,如
new Function('return Date.now()')
关键特性与限制
理解它的行为边界比会写更重要:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 所有通过
new Function创建的函数,执行时只访问全局作用域,无法读取定义时所在函数内的局部变量 - 函数体是字符串,和
eval类似,存在代码注入风险 —— 切勿将用户输入、网络响应等未过滤内容直接拼进函数体 - 没有词法闭包,性能低于常规函数(V8 等引擎难以对其做深度优化)
- 不支持访问
arguments对象(除非显式声明为参数),也不支持默认参数、解构等 ES6+ 语法(函数体字符串里写也没用)
典型使用场景
它不是日常开发工具,而是特定问题的“扳手”:
-
配置驱动的逻辑生成:比如从 JSON 配置中读取字段路径,生成安全的取值函数:
const getter = new Function('obj', 'return obj && obj.user && obj.user.profile && obj.user.profile.name'); -
沙箱化执行:配合
with或代理对象限制可访问变量(注意with已被严格模式禁用,实际需更严谨方案) -
构建工具内部:如打包器把模块代码包裹成
(function(){/* 模块内容 */})()形式,用Function快速构造执行环境
替代建议
95% 的动态需求,优先考虑更安全、更清晰的方式:
- 需要“行为可变” → 用函数表达式赋值:
let handler = (x) => x * 2; handler = (x) => x + 1; - 需要参数化逻辑 → 用高阶函数封装:
const makeAdder = (n) => (x) => x + n; const add5 = makeAdder(5); - 需要运行远端脚本 → 先校验格式、白名单关键字,再考虑
Function;或改用 Web Worker 隔离执行
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










