Reflect.apply 是 ES6 提供的静态方法,用于以更语义化、更安全的方式调用函数并显式指定 this 和参数;它接受目标函数、this 值和参数数组,返回执行结果,且在 target 非函数时抛 TypeError,不依赖原型链,天然协同 Proxy。

Reflect.apply 是 ES6 提供的静态方法,用于**以更语义化、更安全的方式调用函数并显式指定 this 和参数**,相比 Function.prototype.apply,它更符合元编程设计思想,且在 Proxy 中天然协同。
核心用法:替代 apply 的现代写法
它接受三个参数:目标函数、绑定的 this 值、参数数组(类数组或真数组),返回函数执行结果:
Reflect.apply(target, thisArg, argsArray)- 如果
target不是函数,会直接抛出TypeError(而func.apply()可能静默失败或转为全局对象调用) - 不依赖函数原型链,避免被篡改的
apply方法干扰
绑定上下文 + 传参的典型场景
比如调用一个方法并确保它运行在指定对象上:
const obj = { name: 'Alice', greet() { return `Hello, ${this.name}`; } };
const result = Reflect.apply(obj.greet, { name: 'Bob' }, []);
// → "Hello, Bob"
对比传统写法:obj.greet.apply({ name: 'Bob' }, []) 功能一致,但 Reflect.apply 更明确表达“反射式调用”意图,且在严格模式下行为更可靠。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
与 Proxy 配合实现透明拦截
在 Proxy 的 apply 捕获器中,Reflect.apply 是推荐的默认转发方式:
const handler = {
apply(target, thisArg, args) {
console.log('函数被调用,参数:', args);
// 安全、标准地执行原函数
return Reflect.apply(target, thisArg, args);
}
};
const proxy = new Proxy(Math.max, handler);
proxy(1, 2, 3); // 输出日志,并返回 3
这样既保留原始行为,又便于注入逻辑,避免手动调用 target.apply(thisArg, args) 可能引发的异常或原型污染问题。
注意点:参数必须是数组或类数组
args 必须是可遍历的类数组结构(如 [1,2]、arguments、Array.from(arguments)),不能是单个值或对象:
- ✅ 正确:
Reflect.apply(fn, null, [1, 2]) - ❌ 错误:
Reflect.apply(fn, null, 1, 2)(多传参数会被忽略) - ✅ 展开参数:
Reflect.apply(fn, ctx, [...args])或Reflect.apply(fn, ctx, Array.from(args))

















