Reflect.apply 是 JavaScript 中严格校验参数类型与结构的函数调用反射方法:第一个参数必须为函数,第三个参数必须为类数组或可迭代对象,第二个参数显式指定 this 值,执行行为与原生 apply 完全一致。

Reflect.apply 是 JavaScript 中用于安全、规范地执行函数调用的反射方法,它替代了传统 func.apply(thisArg, argsArray) 的写法,更严格地校验参数类型与结构。
参数结构必须是数组(或类数组)
Reflect.apply 的第三个参数 args 必须是可迭代的类数组对象(如 Array、Arguments、TypedArray),否则会抛出 TypeError。它不会像 Function.prototype.apply 那样对非数组参数做宽松处理(例如将字符串转为字符数组)。
- ✅ 正确:传入真实数组
Reflect.apply(fn, obj, [1, 2, 3]) - ✅ 正确:传入 arguments 对象
Reflect.apply(fn, obj, arguments) - ❌ 错误:传入 null / undefined / 字符串 / 普通对象
Reflect.apply(fn, obj, "abc")→ 报错
第一个参数必须是可调用函数
Reflect.apply 要求第一个参数 target 是 typeof 为 "function" 的值,否则直接抛出 TypeError。这比手动检查 typeof fn === 'function' 更早暴露问题。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- ✅ 正确:
Reflect.apply(console.log, console, ['hello']) - ❌ 错误:
Reflect.apply(null, {}, [])→TypeError: Reflect.apply called on non-function
this 值由第二个参数显式指定,不自动绑定
第二个参数 thisArgument 就是目标函数执行时的 this 值,和 apply 一致。注意:它不会被自动包装(如非对象值在非严格模式下会被转为对应包装对象),但 Reflect.apply 本身不改变 this 绑定逻辑,只是原样传递给内部 [[Call]]。
立即学习“Java免费学习笔记(深入)”;
- ✅ 显式传入对象:
Reflect.apply(method, {x: 42}, [10]) - ✅ 传入原始值(会被装箱):
Reflect.apply(String.prototype.toUpperCase, 'abc', [])→"ABC" - ⚠️ 注意:箭头函数无自己的 this,传入的 thisArgument 会被忽略
返回值与异常行为完全同步原生调用
Reflect.apply 的执行结果、错误抛出时机、堆栈信息,都与等价的 target.apply(thisArgument, args) 完全一致。它不是“模拟”,而是标准定义的底层调用入口,适合用于 Proxy handler(如 apply trap)中转发调用。
- 若 target 抛错,Reflect.apply 立即抛相同错误
- 若 target 返回值,Reflect.apply 返回相同值
- 可用于安全封装:例如在调用前校验 args 长度,再用 Reflect.apply 执行

















