掌握this绑定的关键是依据调用方式按优先级判断:new绑定>显式绑定>隐式绑定>默认绑定,箭头函数不参与绑定;常见this丢失场景需用bind、箭头函数或闭包解决。

掌握 this 绑定,关键不是死记规则,而是建立一个清晰的判断路径:看函数怎么被调用,再按优先级逐层匹配。它不依赖函数写在哪,只取决于运行时那一句调用代码长什么样。
盯住调用方式,这是唯一决定因素
同一个函数,不同调用方式,this 就可能指向完全不同对象。比如:
- obj.method() → this 指向 obj(隐式绑定)
- method()(单独调用)→ this 指向全局对象或 undefined(默认绑定)
- method.call(obj2) → this 强制指向 obj2(显式绑定)
- new Constructor() → this 指向新生成的实例(new 绑定)
记住五种绑定的明确优先级
当多种绑定同时存在时,高优先级会覆盖低优先级。顺序不能乱:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- new 绑定(最高):构造函数调用,this 是新实例
- 显式绑定:call / apply / bind 指定的对象,立即或延迟生效
- 隐式绑定:点号(.)或方括号([])调用,this 是“点前面”的那个对象
- 默认绑定:独立调用,非严格模式下是 window/global,严格模式下是 undefined
- 箭头函数:不参与上述优先级,它没有自己的 this,直接沿用外层普通函数的 this 值
重点防住 this 丢失的常见场景
很多 bug 不是规则不懂,而是调用方式悄悄变了:
- 把对象方法赋值给变量再调用:const fn = obj.sayHi; fn(); → 此时已变成独立调用,this 丢失
- 传给 setTimeout、addEventListener 或 Promise 回调:setTimeout(obj.sayHi, 100) → 回调中 this 不再是 obj
- 解决办法很直接:用 bind 固定、用 箭头函数 捕获、或改写为 setTimeout(() => obj.sayHi(), 100)
动手验证比背诵更有效
写几行最简代码,现场观察输出,比读十遍规则更管用:
- 在浏览器控制台输入 console.log(this),看顶层 this 是 window
- 定义 function test() { console.log(this); },分别执行 test() 和 ({}).test = test; ({}).test()
- 对比 function foo() { return () => console.log(this); } 和普通函数内部的 this 行为
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










