函数借用通过call改变this,本质是临时将方法借给另一对象执行,关键在显式指定this值;call绑定this并立即执行,首参为this值,后续为函数参数;典型场景包括借用数组方法处理类数组及复用其他对象方法。

函数借用通过 call 改变 this,本质是临时把一个对象的方法“借”给另一个对象执行,关键在于显式指定调用时的 this 值。
call 的基本用法:绑定 this 并立即执行
call 的第一个参数就是你要指定的 this 值,后续参数依次传入原函数:
-
func.call(obj, arg1, arg2, ...)—— 让func内部的this指向obj,并立刻执行 - 如果第一个参数是
null或undefined,非严格模式下this指向全局对象(如window),严格模式下为undefined
典型借用场景:借用数组方法操作类数组
比如 arguments 是类数组,没有 slice 方法,但可以借用 Array.prototype.slice:
function foo() {
// 把 Array.prototype.slice 的 this 设为 arguments
const arr = Array.prototype.slice.call(arguments);
console.log(arr); // [1, 2, 3]
}
foo(1, 2, 3);
这里 slice 原本需要 this 是数组,而 call 把它临时指向 arguments,于是能正确读取长度和索引属性。
借用其他对象的方法:实现快速复用
假设有两个对象,其中一个有方法,另一个想“借用”:
const person = {
name: 'Alice',
greet() {
return `Hello, I'm ${this.name}`;
}
};
const guest = { name: 'Bob' };
// 把 person.greet 借给 guest 执行
console.log(person.greet.call(guest)); // "Hello, I'm Bob"
注意:不是复制方法,而是让 greet 在 guest 上下文中运行 —— this 变了,行为就变了。
与 apply 和 bind 的区别要点
call 和 apply 都是立即执行,区别只在参数传递方式:
– call:参数逐个列出
– apply:参数用数组传入
bind 不执行,而是返回一个新函数,this 和部分参数被预先绑定
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











