call实现 js
实现 JavaScript 的 call 方法
call 方法是 JavaScript 中函数原型的一个内置方法,用于显式绑定函数的 this 值,并立即执行该函数。以下是手动实现 call 的方法:
Function.prototype.myCall = function(context, ...args) {
// 如果 context 为 null 或 undefined,默认绑定到全局对象(浏览器中为 window)
context = context || window;
// 将当前函数(this)作为 context 的一个属性
const fn = Symbol('fn');
context[fn] = this;
// 调用函数并传入参数
const result = context[fn](...args);
// 删除临时属性
delete context[fn];
return result;
};
使用示例
function greet(message) {
console.log(`${message}, ${this.name}`);
}
const person = { name: 'Alice' };
// 原生 call 方法
greet.call(person, 'Hello'); // 输出: Hello, Alice
// 自定义 myCall 方法
greet.myCall(person, 'Hi'); // 输出: Hi, Alice
实现原理说明
- 绑定上下文:将函数作为传入的
context对象的一个临时属性,确保函数调用时的this指向context。 - 参数处理:使用剩余参数
...args收集所有传入的参数,并在调用时展开。 - 清理临时属性:调用完成后删除临时添加的属性,避免污染
context对象。 - 返回值处理:返回函数的执行结果,保持与原版
call一致的行为。
边界情况处理
- 如果
context为null或undefined,默认绑定到全局对象(如浏览器中的window)。 - 使用
Symbol创建临时属性名,避免与context对象的原有属性冲突。
与 apply 的区别
call 和 apply 功能类似,但 call 接受参数列表,而 apply 接受参数数组。例如:
greet.call(person, 'Hello');
greet.apply(person, ['Hello']);
手动实现 apply 的方法类似,只需将参数改为数组形式即可。







