js apply实现
apply 方法的基本概念
apply 是 JavaScript 中函数对象的一个方法,用于调用函数并指定函数的 this 值和参数列表。它的语法如下:
function.apply(thisArg, [argsArray])
thisArg 是函数运行时使用的 this 值,argsArray 是一个数组或类数组对象,包含传递给函数的参数。
手动实现 apply 方法
可以通过以下步骤手动实现 apply 方法:
Function.prototype.myApply = function(context, argsArray) {
context = context || window;
const fn = Symbol('fn');
context[fn] = this;
const result = context[fn](...argsArray);
delete context[fn];
return result;
};
实现步骤解析
-
绑定上下文:
将函数的this值绑定到传入的context对象。如果未传入context,默认使用全局对象(浏览器中为window)。 -
临时存储函数:
使用Symbol创建一个唯一的属性名,避免覆盖context对象的原有属性。
-
执行函数:
将函数作为context的方法调用,并传入参数数组argsArray。 -
清理临时属性:
删除临时添加到context对象上的函数属性。 -
返回结果:
返回函数调用的结果。
示例代码
function greet(message) {
console.log(`${message}, ${this.name}!`);
}
const person = { name: 'Alice' };
greet.myApply(person, ['Hello']); // 输出: Hello, Alice!
注意事项
-
参数处理:
如果argsArray未提供或为null/undefined,函数调用时不传入任何参数。 -
严格模式:
在严格模式下,thisArg为null或undefined时,this不会自动指向全局对象。 -
Symbol 兼容性:
如果环境不支持Symbol,可以使用随机字符串作为临时属性名。
与 call 方法的区别
apply 和 call 的功能类似,区别在于参数传递方式:
apply接受参数数组。call接受参数列表。
greet.call(person, 'Hello'); // call 使用参数列表
greet.apply(person, ['Hello']); // apply 使用参数数组






