隐式绑定中this永远指向点号或方括号左侧紧挨函数名的对象,如obj.a.b.method()中this为obj.a.b;解构、赋值、传参等会使调用脱离原对象,导致this丢失。

隐式绑定中,this 永远指向“点号左边最近的那个对象”,和嵌套层数、外层对象、作用域链都无关。只看调用时的**直接调用者**。
只认最后一层,不追溯整个对象链
比如 obj.a.b.method(),this 不是 obj,也不是 obj.a,而是 obj.a.b —— 也就是点操作符左侧紧挨着函数名的那个对象。
-
const user = { profile: { name: 'Alice', getName() { return this.name; } } };
调用user.profile.getName()→this是user.profile,能正确返回'Alice' -
const getName = user.profile.getName;
赋值后单独调用getName()→ 隐式绑定丢失,退化为默认绑定(this是undefined或window)
方括号访问也遵循同一规则
用 [] 语法调用,效果和点号一致:谁在“.”或“[”前,谁就是 this。
-
obj['inner']['handler']()→this是obj['inner'] -
obj.nested?.method()(可选链)→ 如果存在,this仍是obj.nested;如果nested为null/undefined,则不执行,无 this 问题
常见陷阱:看似嵌套,实则已脱离对象上下文
一旦函数被提取出来,就不再受原对象约束。这不是“嵌套太深导致失效”,而是调用形式变了。
- 解构:
const { method } = obj.nested; method();→ 默认绑定 - 传参:
setTimeout(obj.nested.fn, 100);→fn被当作普通函数调用,this丢失 - 箭头函数包裹:
() => obj.nested.fn()→fn仍由obj.nested调用,this正确;但箭头函数自身没有this,不影响该调用
判断方法很简单:盯住调用那一行代码
不用翻定义位置,也不用数嵌套几层。只需问一句:这个函数名前面紧挨着的是哪个对象?
-
api.data.fetch()→this是api.data -
settings.handlers.click()→this是settings.handlers -
page.sections[2].render()→this是page.sections[2]

















