隐式绑定的this指向调用时点号或方括号左侧的具体对象;如obj.say()中this为obj,但赋值后调用(fn=obj.say; fn())或解构后调用({say}=obj; say())会丢失绑定。

隐式绑定的 this 指向,取决于「谁调用了这个函数」——更准确地说,是看函数调用时的**直接前缀对象**(即点号左边的对象)。
隐式绑定的判定规则
当一个函数作为对象的属性被调用(即形如 obj.method()),且该调用满足以下两个条件,就触发隐式绑定:
- 函数引用来源于对象的一个属性(不是赋值、传参或间接调用)
- 调用时使用了点号(
.)或方括号([])语法,且左侧是一个**具体对象值**(非undefined或null)
此时,this 就绑定为那个左侧对象。
常见情况举例说明
✅ 正确触发隐式绑定:
const obj = {
name: 'Alice',
say() {
console.log(this.name); // 'Alice'
}
};
obj.say(); // this → obj
✅ 方括号访问也有效:
obj['say'](); // this → obj
❌ 赋值后调用会丢失绑定(变成默认绑定):
const fn = obj.say; fn(); // this → 全局对象(非严格模式)或 undefined(严格模式)
❌ 解构赋值同样断开隐式绑定:
const { say } = obj;
say(); // this 不再是 obj
注意边界:嵌套对象与中间变量
隐式绑定只看「调用时点号左边的最终求值结果」,不关心函数定义在哪层对象里:
const inner = { name: 'Bob' };
const outer = {
inner,
greet() {
console.log(this.inner.name); // this → outer,但 this.inner 是 outer.inner
}
};
outer.greet(); // 输出 'Bob',因为 this 是 outer
但如果这样写:
const { greet } = outer;
greet(); // this → undefined(严格模式),不再指向 outer
如何验证当前 this 是什么?
在函数内部加一句调试语句即可:
console.log(this);- 或者用
console.assert(this === obj, 'this 应该是 obj');
不复杂但容易忽略。关键就是盯住调用时的「点左边是谁」。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











