隐式绑定中this始终指向直接调用函数的对象,即点号或方括号右侧紧邻的对象;赋值、setTimeout传入函数引用或解构会导致隐式丢失;可用箭头函数、bind、类字段箭头函数或保持原调用链来保留this。

隐式绑定在多层对象嵌套时,this 始终指向“直接调用该函数的对象”,而不是整个链路上的任意对象。关键不在嵌套有多深,而在“点号(.)或方括号([])右边紧挨着的那个对象”。
只看最后一层调用者
例如:
const user = {
profile: {
info: {
name: '李四',
getName() {
return this.name;
}
}
}
};
user.profile.info.getName(); // "李四"
这里 getName 是通过 info.getName() 调用的,所以 this 指向 info 对象,而非 profile 或 user。
即使写成 user['profile']['info'].getName(),效果也一样——只要最后是 info.getName() 这种形式,this 就绑定到 info。
立即学习“Java免费学习笔记(深入)”;
常见陷阱:赋值后调用导致隐式丢失
一旦把方法从对象中“抽出来”,就不再是隐式绑定,而是默认绑定:
-
const fn = user.profile.info.getName;→fn()中this指向全局(非严格)或undefined(严格) -
setTimeout(user.profile.info.getName, 100);→ 同样丢失,因为传入的是函数引用,不是调用表达式 -
const { getName } = user.profile.info;→ 解构后调用getName()也会丢失
如何安全保留 this 指向
遇到嵌套对象又要避免丢失,可选以下方式:
- 用箭头函数包装:
setTimeout(() => user.profile.info.getName(), 100) - 显式绑定:
setTimeout(user.profile.info.getName.bind(user.profile.info), 100) - 在定义时就绑定(如类字段写法):
getName = () => this.name(注意:此时this继承外层作用域,需确保外层this正确) - 调用时不拆解,保持原调用链:
user.profile.info.getName.call(user.profile.info)(不推荐日常使用,仅用于调试或特殊逻辑)
DOM 场景中的实际表现
类似逻辑也适用于 DOM:
const box = document.querySelector('.box');
const innerBtn = box.querySelector('button');
innerBtn.addEventListener('click', function() {
console.log(this === innerBtn); // true
});
虽然 innerBtn 是从 box 里查出来的,但事件处理器是作为 innerBtn 的方法被调用的,所以 this 指向 innerBtn,不是 box。


















