点号左侧对象即this指向对象,无论函数定义方式、是否继承或嵌套,只要调用形式为obj.method(),this就绑定obj;赋值后调用会丢失绑定。

对象点语法调用时,this 指向该点号左侧的对象,这是最直接、最可靠的判断方式。
点号左边是谁,this 就是谁
当函数通过 obj.method() 这种形式调用时,JavaScript 引擎会把 obj 绑定给该函数内部的 this。这个规则优先级高,不依赖函数定义位置或是否箭头函数,只看**实际调用时点号左边的引用值**。
- 即使方法是继承来的(比如从原型链上找到的),只要调用写成
obj.method(),this仍是obj - 如果点号左边是表达式(如
(obj || other).method()),则取表达式最终求值结果作为this - 注意:不能写成
let fn = obj.method; fn();——这会丢失绑定,this变成undefined(严格模式)或全局对象
常见易错点:赋值后调用就失效
把带点的调用拆成两步,就破坏了 this 绑定:
-
obj.sayName();→this是obj -
const f = obj.sayName; f();→this不再是obj,而是调用上下文决定(通常为undefined) - 想保留绑定,可用
obj.sayName.bind(obj)、() => obj.sayName(),或直接写成obj.sayName.call(obj)
嵌套对象也一样,只看最近的点号左边
例如:user.profile.info.getName(),this 指向的是 info 对象,不是 user 或 profile。
- 引擎只关心“谁在点后面调用”,也就是
info.getName()中的info - 哪怕
info是个空对象,只要它是点号左侧的值,this就是它
与字面量写法无关,只看运行时调用形式
函数怎么定义的不重要,关键看怎么调用:
-
const obj = { fn() { console.log(this); } }; obj.fn();→this是obj -
function foo() { console.log(this); }; const obj = { fn: foo }; obj.fn();→this还是obj - 定义方式不影响,只有调用时的点号左侧才起决定作用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











