call、apply、bind均可显式绑定this:call立即执行并逐个传参;apply立即执行但以数组传参;bind返回预设this和参数的新函数,不立即执行。

JavaScript 中的 this 指向可以通过 call、apply、bind 进行显式绑定,它们都能把函数内部的 this 强制指定为某个对象,区别在于调用时机和参数传递方式。
call:立即执行,参数逐个传入
call 会立刻调用函数,并把第一个参数作为函数运行时的 this,后续参数按顺序依次传入函数。
- 语法:
func.call(thisArg, arg1, arg2, ...) -
thisArg为null或undefined时,非严格模式下指向全局对象(如浏览器中是window),严格模式下保持null/undefined - 适合已知所有参数且想马上执行的场景
示例:
const obj = { name: 'Alice' };
function greet(age, city) {
console.log(`I'm ${this.name}, ${age} years old, from ${city}`);
}
greet.call(obj, 25, 'Beijing'); // I'm Alice, 25 years old, from Beijing
apply:立即执行,参数以数组形式传入
apply 和 call 行为一致,都是立即调用,但第二个参数必须是数组(或类数组对象),用于批量传参。
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 语法:
func.apply(thisArg, [arg1, arg2, ...]) - 常用于把已有数组“展开”传给函数,比如
Math.max(...arr)的替代写法
示例:
const numbers = [3, 7, 1]; console.log(Math.max.apply(null, numbers)); // 7
bind:返回新函数,不立即执行
bind 不调用原函数,而是返回一个 this 被永久绑定、且预设了部分参数的新函数。之后无论怎么调用,this 都不会变。
- 语法:
const newFunc = func.bind(thisArg, arg1, arg2, ...) - 返回函数可多次调用,适用于事件监听、回调、柯里化等需要“固化上下文”的场景
- 即使新函数被作为普通函数调用(无点号、无对象调用),
this仍保持绑定值(箭头函数除外)
示例:
const user = { name: 'Bob' };
function sayHello(greeting) {
console.log(`${greeting}, I'm ${this.name}`);
}
const boundSay = sayHello.bind(user, 'Hi');
boundSay(); // Hi, I'm Bob
// 即使 later 调用,this 依然指向 user
注意:绑定优先级与不可逆性
call/apply/bind 属于显式绑定,在 this 绑定优先级中高于隐式绑定(如 obj.fn())和默认绑定(如独立调用 fn()),但低于 new 绑定(构造函数调用)。
- 一旦用
bind绑定了this,再对返回函数重复bind无效(首次绑定生效) -
call和apply是“一次性覆盖”,不影响原函数,也不影响其他调用 - 箭头函数没有自己的
this,它继承外层作用域的this,因此无法被这三种方法改变
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










