reflect.apply 的 this 由第二个参数 thisarg 精准控制,不自动转换 null/undefined,行为比 call/apply 更严格一致;仅对普通函数和 class 方法有效,对箭头函数无效。

在 Reflect.apply 中,this 的绑定不是通过第一个参数直接指定的,而是由第二个参数(即 thisArg)明确控制——它就是函数内部 this 的值,无需额外绑定。
Reflect.apply 的参数顺序和 this 绑定逻辑
Reflect.apply(target, thisArg, argsList) 三个参数含义如下:
- target:要调用的函数(必须是可调用对象)
-
thisArg:函数执行时内部
this所指向的对象(精准生效,无隐式转换) - argsList:类数组或数组,作为函数的实参逐个传入
注意:thisArg 不会像 call/apply 那样对原始值做包装(如 null/undefined → 全局对象),而是严格按传入值设置 this。例如传 undefined,函数内 this 就是 undefined(严格模式下)。
与 call/apply 的关键区别:更干净的 this 控制
对比传统方式:
-
fn.call(obj, a, b)→this是obj,参数逐个列出 -
fn.apply(obj, [a, b])→this是obj,参数需打包成数组 -
Reflect.apply(fn, obj, [a, b])→ 效果等价于apply,但语义更明确、行为更一致(不自动修正thisArg)
这意味着:如果你需要确保 this 精准等于某个值(比如 null 或 42),Reflect.apply 比 apply 更可靠。
实际调用示例:传参 + this 精准控制
假设有一个依赖 this 的方法:
const obj = { value: 100 };
function double() {
return this.value * 2;
}
使用 Reflect.apply 调用并绑定 this:
const result = Reflect.apply(double, obj, []); // this → obj,无参数 console.log(result); // 200
带参数的函数也一样:
function add(x, y) {
return this.base + x + y;
}
const context = { base: 10 };
const sum = Reflect.apply(add, context, [2, 3]); // this → context,参数为 2 和 3
console.log(sum); // 15
注意事项:箭头函数与 this 不可重绑
Reflect.apply 无法改变箭头函数的 this,因为它继承自外层作用域,且没有自己的 this 绑定机制:
const arrow = () => this.val;
const result = Reflect.apply(arrow, { val: 99 }, []); // this 仍是定义时的上下文,不是 {val: 99}
所以,只对普通函数、class 方法等有显式 this 绑定语义的函数有效。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











