js 实现call
实现 call 方法
在 JavaScript 中,call 方法是函数原型上的一个方法,用于改变函数执行时的 this 指向。以下是手动实现 call 方法的步骤:
Function.prototype.myCall = function(context, ...args) {
context = context || window;
const fn = Symbol('fn');
context[fn] = this;
const result = context[fn](...args);
delete context[fn];
return result;
};
实现原理
-
将函数设置为传入对象的属性
- 使用
Symbol创建一个唯一键,避免属性名冲突 - 将当前函数(
this)赋值给这个属性
- 使用
-
执行函数并获取结果
- 使用扩展运算符处理传入的参数
- 执行函数并保存返回值
-
清理临时属性

- 删除添加到对象上的临时属性
- 返回函数执行结果
使用示例
function greet(greeting, punctuation) {
console.log(greeting + ', ' + this.name + punctuation);
}
const person = { name: 'Alice' };
greet.myCall(person, 'Hello', '!'); // 输出: Hello, Alice!
注意事项
- 当不传入上下文时,默认使用全局对象(浏览器中是
window) - 使用
Symbol可以避免属性名冲突,在不支持Symbol的环境中可以使用随机字符串代替 - 该方法实现了原生
call的核心功能,但不包括一些边界情况处理(如原始值包装等)






