this指向由调用方式决定,call、apply和bind可显式指定this:call立即执行并逐个传参,apply立即执行但以数组传参,bind返回永久绑定this的新函数。

JavaScript 中的 this 指向取决于函数**如何被调用**,而 call、apply 和 bind 是三种可以**显式指定 this 值**的方法。它们的核心作用一致:让函数在指定的对象上下文中执行,但调用时机和方式不同。
call:立即执行,参数逐个传入
call 会立刻调用函数,并把第一个参数作为该函数运行时的 this,后续参数依次传给函数本身。
语法:func.call(thisArg, arg1, arg2, ...)
-
thisArg:函数体内
this将指向的对象;若为null或undefined,非严格模式下指向全局对象(如window),严格模式下保持null/undefined - arg1, arg2...:按顺序传给函数的实际参数
示例:
const person = { name: 'Alice' };function introduce(age, city) {
console.log(`I'm ${this.name}, ${age} years old, live in ${city}.`);
}
introduce.call(person, 28, 'Beijing'); // I'm Alice, 28 years old, live in Beijing.
apply:立即执行,参数以数组形式传入
apply 和 call 行为一致——都是立即调用函数,区别只在于**参数传递方式**:apply 接收一个数组(或类数组)作为参数列表。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
语法:func.apply(thisArg, [argsArray])
-
thisArg:同
call,指定this绑定对象 -
argsArray:必须是数组或类数组(如
arguments),元素将作为函数参数依次传入
常见用途:借用数组方法、求最值等
const numbers = [3, 7, 1, 9];Math.max.apply(null, numbers); // 9
// 等价于 Math.max(3, 7, 1, 9)
bind:返回新函数,延迟执行,永久绑定 this 和部分参数
bind 不会立即调用函数,而是**返回一个新函数**,这个新函数的 this 被永久绑定到 bind 的第一个参数,且可预设部分参数(柯里化)。
语法:func.bind(thisArg, arg1, arg2, ...)
- 返回的函数无论之后如何调用(包括作为事件回调、setTimeout 回调、被其他对象引用),
this始终是bind时指定的对象 - 预设的参数会“固定”在前面,后续调用时传入的参数追加在后面
示例:
const obj = { value: 42 };function log(msg) { console.log(this.value, msg); }
const boundLog = log.bind(obj, '[INFO]');
boundLog('loaded'); // 42 "[INFO]" "loaded"
// 即使换环境调用,this 仍指向 obj
setTimeout(boundLog, 100, 'delayed'); // 42 "[INFO]" "delayed"
三者对比与使用建议
- 需要马上执行且参数已知 → 优先用
call(参数少)或apply(参数是数组/动态) - 需要复用函数并固定 this(比如事件监听、回调传参)→ 用
bind -
bind返回的函数可再次call/apply,但不会覆盖原始绑定的this(除非 new 调用) - 箭头函数没有自己的
this,所以call/apply/bind对它无效
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










