call、apply 和 bind 都用于显式指定函数执行时的 this 值:call 立即执行并逐个传参,apply 立即执行但以数组传参,bind 返回绑定 this 和部分参数的新函数。

JavaScript 中的 call、apply 和 bind 都是用来显式指定函数执行时 this 值的方法,它们的核心能力就是“改变函数内部的 this 指向”——但这不是魔法,而是 JavaScript 函数作为一等对象、且 this 在调用时才绑定的机制决定的。
call:立即执行,参数逐个传入
call 会立刻调用函数,并把第一个参数作为该次执行的 this,后续参数依次传给函数。
例如:
function greet(greeting, punctuation) {
return `${greeting}, ${this.name}${punctuation}`;
}
const person = { name: 'Alice' };
greet.call(person, 'Hello', '!'); // "Hello, Alice!"
这里 this 被绑定为 person,所以函数内能访问 this.name。
立即学习“Java免费学习笔记(深入)”;
apply:立即执行,参数以数组形式传入
apply 和 call 行为一致,区别只在参数传递方式:它接受一个数组(或类数组)作为参数列表。
适合已有一个参数数组的场景,比如求最大值:
Math.max.apply(null, [1, 5, 3]); // 5
注意:第一个参数仍是 this 值,这里用 null 是因为 Math.max 不依赖 this。
bind:返回新函数,this 和部分参数被预先固定
bind 不执行函数,而是返回一个“绑定好 this(和可选的前置参数)”的新函数。这个新函数无论怎么调用,this 都不会变。
例如:
const boundGreet = greet.bind(person, 'Hi');
boundGreet('.'); // "Hi, Alice."
即使之后把 boundGreet 赋给别的对象或在全局调用,this 依然指向 person。这是因为它内部创建了一个闭包,保存了绑定的 this 和初始参数。
为什么它们能改变 this?本质是调用时绑定机制
JavaScript 的 this 不是在函数定义时确定的,而是在每次函数被“调用”时,根据调用方式动态决定的。普通调用(fn())、方法调用(obj.fn())、构造调用(new fn())对应不同 this 规则。
call、apply、bind 是语言提供的底层接口,让开发者可以绕过默认规则,**强制指定某次调用的 this 值**。它们本质上是“手动触发一次函数调用”,并把传入的第一个参数当作本次执行的上下文对象。
简单说:不是“改了函数的 this”,而是“让函数这一次用你给的 this 去执行”。











