JavaScript显式绑定通过call、apply、bind手动指定this:call立即执行并逐个传参;apply立即执行但参数以数组传入;bind返回永久绑定this且可预设参数的新函数,三者优先级高于隐式和默认绑定但低于new绑定。

JavaScript 中显式绑定就是通过 call、apply 和 bind 三个方法,手动指定函数执行时的 this 值,从而强制改变其指向。
call:立即执行,参数逐个传入
调用 func.call(thisArg, arg1, arg2, ...),会立即将 func 的 this 绑定为 thisArg,并用后续参数依次调用函数。
- 第一个参数是想要绑定的
this对象(传null或undefined在非严格模式下会指向全局对象) - 后续参数按顺序传递给函数
- 适合已知所有参数且需立刻执行的场景
例如:function greet(greeting, punctuation) {<br> return `${greeting}, ${this.name}${punctuation}`;<br>}<br>const person = { name: 'Alice' };<br>greet.call(person, 'Hello', '!'); // "Hello, Alice!"
apply:立即执行,参数以数组形式传入
func.apply(thisArg, [arg1, arg2, ...]) 与 call 行为一致,区别只在参数传递方式——第二个参数必须是数组(或类数组对象)。
- 常用于将数组“展开”作为函数参数,比如
Math.max(...arr)的替代写法 - 也适合参数数量不确定、但已存在数组结构的情况
例如:const numbers = [3, 7, 1];<br>Math.min.apply(null, numbers); // 1
bind:返回新函数,绑定后可延迟调用
func.bind(thisArg, arg1, arg2, ...) 不执行函数,而是返回一个 this 永久绑定为 thisArg 的新函数,并预设部分参数(柯里化)。
立即学习“Java免费学习笔记(深入)”;
- 返回的函数无论怎么调用(包括作为事件回调、定时器、异步回调),
this都不会变 - 预设参数会在实际调用时排在最前面,后续传参追加在后面
- 适用于需要复用、解耦或避免
this丢失的场景(如事件监听、setTimeout)
例如:function log(prefix, msg) {<br> console.log(`${prefix} [${this.id}]: ${msg}`);<br>}<br>const obj = { id: 101 };<br>const boundLog = log.bind(obj, '[INFO]');<br>boundLog('loaded'); // "[INFO] [101]: loaded"
注意点:优先级与不可逆性
显式绑定(call/apply/bind)的优先级高于隐式绑定(如 obj.method())和默认绑定,但低于 new 绑定。一旦用 bind 绑定过,无法被后续的 call 或 apply 覆盖(除非再次 bind)。
-
bind返回的函数自带内部[BoundTargetFunction]属性,使其this固定 - 箭头函数没有自己的
this,显式绑定对其无效(它始终继承外层作用域的this) - 严格模式下,传入原始值(如字符串、数字)会直接作为
this;非严格模式下会被自动包装成对应对象


















