js实现apply


实现 apply 方法
在 JavaScript 中,apply 是函数原型上的方法,用于调用函数并指定 this 值和参数数组。以下是手动实现 apply 的核心思路:
Function.prototype.myApply = function(context, argsArray) {
// 确保 context 是对象,默认指向全局对象(非严格模式下)
context = context || window;
// 为 context 创建一个临时唯一属性,避免属性名冲突
const fnKey = Symbol('tempFn');
context[fnKey] = this;
// 执行函数并保存结果
const result = context[fnKey](...argsArray);
// 删除临时属性
delete context[fnKey];
return result;
};
关键点说明
this绑定:通过将函数赋值给context的属性,利用对象方法调用的特性实现this绑定。- 参数处理:
argsArray是数组或类数组对象,使用扩展运算符...展开为参数列表。 - 兼容性:未传入
context时默认指向全局对象(浏览器中为window)。 - Symbol 使用:避免临时属性名与
context原有属性冲突。
示例测试
function greet(message, punctuation) {
return `${message}, ${this.name}${punctuation}`;
}
const person = { name: 'Alice' };
console.log(greet.myApply(person, ['Hello', '!'])); // 输出: "Hello, Alice!"
边界情况处理
- 非对象
context:原始值(如数字、字符串)会被自动转换为对象形式。 - 非数组参数:若
argsArray不是数组或类数组,会抛出错误(与原生apply行为一致)。 - 无参数:省略
argsArray时等同于不传参数。
与原生 apply 的差异
- 严格模式:原生
apply在严格模式下context为null/undefined时保持原值,此实现需额外处理。 - 性能:原生方法经过引擎优化,手动实现可能有性能损耗。
此实现覆盖了 apply 的核心功能,可用于理解其工作原理或在不支持的环境中提供兼容性。






