显式绑定(apply/call)可覆盖bind的硬绑定;bind函数仍可被apply/call重定向this,仅new调用时忽略硬绑定;非严格模式下apply(null)会fallback到全局对象。

显式绑定后的函数,再次用 apply 修改 this 指向——会成功覆盖原有绑定。
bind 返回的函数是“硬绑定”的,但 apply 优先级更高
用 bind 创建的函数内部会永久绑定 this,看起来不可更改。但这个“不可变”只在普通调用时生效;一旦你主动用 call 或 apply 显式传入新的 thisArg,JavaScript 引擎就会以显式绑定为最高优先级,直接覆盖 bind 设定的值。
-
bind生成的函数本质仍是普通函数,它没有禁用call/apply的能力 -
apply属于显式绑定,而显式绑定优先级高于硬绑定(即bind) - 只有
new调用时,硬绑定函数的this才会被忽略(此时this指向新实例)
实际例子一眼看懂
假设:
const obj1 = { name: 'A' };
const obj2 = { name: 'B' };
function greet() { console.log(this.name); }
const boundFn = greet.bind(obj1);
boundFn(); // 输出 'A'
boundFn.apply(obj2); // 输出 'B' —— apply 生效了
boundFn.call(obj2); // 同样输出 'B'
注意 null/undefined 在非严格模式下的自动转换
即使你对已绑定函数使用 apply(null),只要不是严格模式,this 仍会 fallback 到全局对象(如 window),而不是保持 bind 时的 obj1。
- 严格模式下:
apply(null)→this就是null - 非严格模式下:
apply(null)→this变成window(或globalThis)
bind 之后还能被重定向,本质是函数可调用性未被封锁
bind 并没把函数变成“只读”,它只是预设了默认 this 和部分参数。你依然可以:
- 用
apply/call强制指定新this - 用
new实例化(此时this不再是绑定值) - 甚至用
bind再 bind 一次(后一次覆盖前一次)











