显式绑定this可解决方法借用时的指向问题,因赋值或传参会导致this丢失;call/apply立即执行并指定this和参数,bind预绑定this生成可复用新函数并支持柯里化。

用 call、apply 或 bind 显式绑定 this,就能在借用方法时确保指向正确对象,避免“指针错乱”。
为什么借用方法会出问题?
当把一个对象的方法赋值给变量或传给函数时,this 会丢失原始绑定,变成 undefined(严格模式)或全局对象(非严格模式)。比如:
```js
const obj = { name: 'Alice', greet() { console.log('Hello, ' + this.name); } };
const sayHi = obj.greet;
sayHi(); // Hello, undefined —— this 指向错了
```
用 call/apply 立即绑定并执行
适合一次性调用,直接指定 this 和参数:
-
func.call(context, arg1, arg2):传参用逗号分隔 -
func.apply(context, [arg1, arg2]):传参用数组
```js
sayHi.call(obj); // Hello, Alice
obj.greet.call({ name: 'Bob' }); // Hello, Bob
```
用 bind 预绑定生成新函数
适合多次复用,返回一个 this 固定的新函数:
- 绑定后的新函数无论怎么调用,
this始终是预设对象 - 可提前绑定部分参数(柯里化)
```js
const boundGreet = obj.greet.bind(obj);
boundGreet(); // Hello, Alice
// 绑定 this + 部分参数
function introduce(greeting, from) {
console.log(`${greeting}, I'm ${this.name} from ${from}`);
}
const aliceIntro = introduce.bind({ name: 'Alice' }, 'Hi');
aliceIntro('Beijing'); // Hi, I'm Alice from Beijing
```
箭头函数不能替代显式绑定
箭头函数没有自己的 this,它继承外层作用域的 this,但**不适用于借用方法场景**:
- 它无法动态绑定目标对象,写死在外层上下文里
- 如果外层
this不是你想要的,结果还是错的 - 真正需要的是“把方法借过来,还按原对象运行”,这只能靠
call/apply/bind
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











