js apply 实现
理解 apply 方法
apply 是 JavaScript 中函数对象的一个内置方法,用于调用函数并指定 this 值和参数数组。其语法为:function.apply(thisArg, [argsArray])thisArg 是函数运行时指定的 this 值,argsArray 是参数数组(或类数组对象)。
手动实现 apply
以下是手动实现 apply 的代码示例,核心思路是通过对象属性调用函数并传递参数:
Function.prototype.myApply = function(context, argsArray) {
// 默认绑定全局对象(非严格模式下)
context = context || window;
// 为 context 创建唯一属性,避免覆盖原有属性
const fnKey = Symbol();
context[fnKey] = this;
// 执行函数并保存结果
const result = context[fnKey](...argsArray);
// 删除临时属性
delete context[fnKey];
return result;
};
关键步骤解析
-
绑定
this值
若未传入context,默认绑定全局对象(浏览器中为window)。
使用Symbol()确保临时属性唯一,避免与对象原有属性冲突。
-
参数处理
通过扩展运算符...将数组参数展开为独立参数。
若argsArray未传入,函数仍可正常调用(参数为undefined)。 -
清理与返回
执行后删除临时属性,避免副作用。
返回函数执行结果,与原版apply行为一致。
边界情况处理
-
严格模式
若全局对象为undefined(严格模式),需显式处理context为null或undefined的情况。 -
非对象
thisArg
原始值(如数字、字符串)会被自动转换为对象包装类型。
使用示例
function greet(message) {
return `${message}, ${this.name}!`;
}
const person = { name: 'Alice' };
console.log(greet.myApply(person, ['Hello'])); // 输出: "Hello, Alice!"
与原版 apply 的区别
- 性能
原生apply由引擎优化,性能更高。手动实现依赖属性访问和展开运算符。 - 异常处理
原生apply对无效参数(如非数组的argsArray)会抛出错误,手动实现需额外校验。






