隐式绑定的关键是调用时“点号左边是谁”,即obj.method()中this指向obj;需同时满足函数为对象属性且调用形式为原汁原味的点号加括号。

掌握隐式绑定的关键,在于盯住调用时的“点号左边是谁”。只要函数是通过 obj.method() 这种形式直接调用,this 就一定指向 obj —— 不看函数在哪定义,只看它被谁“点”出来。
确认隐式绑定生效的两个硬条件
缺一不可:
- 函数必须是对象的一个属性(比如
user.greet中greet是user的属性) - 调用必须是“原汁原味”的点号加括号:必须写成
user.greet(),不能中间拆开
识别常见失效场景
看似在调用方法,实则已脱离对象上下文:
- 赋值后调用:
const fn = user.greet; fn();→this不再是user - 传入回调:
setTimeout(user.greet, 100);→ 定时器内部是独立调用 - 解构提取:
const { greet } = user; greet();→ 左侧已不是user - 嵌套调用只认最后一层:
outer.inner.method()中this指向inner,不是outer
修复丢失的 this 指向
不是靠猜,而是有明确手段补救:
- 用
bind锁定:setTimeout(user.greet.bind(user), 100) - 用箭头函数包裹:
setTimeout(() => user.greet(), 100) - 手动调用保持上下文:
setTimeout(function() { user.greet(); }, 100) - 解构时提前绑定:
const greet = user.greet.bind(user); greet();
验证 this 指向的最快方式
在方法内部加一句 console.log(this);,运行看输出。如果输出的是预期对象,说明隐式绑定成功;如果输出 undefined(严格模式)或 window(非严格),就说明调用形式已被破坏。











