显式绑定通过call实现方法借用,即让对象临时调用其他对象方法并指定this指向;方法借用不复制代码,而是利用call将数组原型方法(如slice、push)应用于类数组或普通对象,依赖目标对象具备length和数字索引即可正常执行。

显式绑定通过 call 实现方法借用,核心是让一个对象“临时借用”另一个对象的方法,并指定该方法内部 this 指向目标对象。
什么是方法借用
方法借用指不复制函数代码,而是直接调用其他对象身上的方法,同时控制其执行时的 this 值。比如数组方法(如 slice、push)被类数组对象(如 arguments、NodeList)使用。
由于类数组对象没有这些方法,但它们结构类似数组(有 length 和数字索引),所以可通过 call 把数组原型上的方法“借”过来用。
call 的基本语法与作用
func.call(thisArg, arg1, arg2, ...) 立即调用函数 func,并强制将 this 绑定为 thisArg,后续参数依次传入。
-
thisArg是方法执行时函数体内this的指向 - 若传
null或undefined,非严格模式下指向全局对象(如window),严格模式下保持为null/undefined - 参数必须逐个列出,不能传数组(这点区别于
apply)
实际借用示例
把数组的 slice 借给 arguments:
function sum() {
// arguments 是类数组,没有 slice 方法
const args = Array.prototype.slice.call(arguments);
return args.reduce((a, b) => a + b, 0);
}
sum(1, 2, 3); // 6
把数组的 push 借给普通对象(模拟数组行为):
const obj = { length: 0 };
Array.prototype.push.call(obj, 'a', 'b');
console.log(obj); // {0: 'a', 1: 'b', length: 2}
借用 DOM 方法操作 NodeList:
const divs = document.querySelectorAll('div');
// NodeList 没有 forEach,但可以借用数组的
Array.prototype.forEach.call(divs, el => el.classList.add('active'));
为什么能成功借用
关键在于 JavaScript 方法的设计是“数据无关”的——像 slice、push 只依赖 this 上是否存在 length 属性和数字索引属性,不校验是否真是 Array 实例。
-
slice读this.length,再按索引取值this[0]、this[1]… - 只要目标对象满足“有 length + 数字键”,就能正常工作
-
call提供了精准控制this的能力,填补了类数组无法直接调用的缺口
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











