普通函数的this在调用时确定,箭头函数的this在定义时继承外层作用域且不可更改;前者适用于需动态绑定this的场景,后者适用于保持外层this一致的回调等场景。

定义时就能看出 this 的归属方式——普通函数的 this 是“空着等运行时填”,箭头函数的 this 是“当场锁定、不可更改”。
普通函数:this 在调用时才决定
普通函数不关心自己在哪定义,只看谁在调用它:
- 作为对象方法调用(obj.fn()),this 指向 obj
- 单独调用(fn()),非严格模式下 this 指向全局对象(如 window),严格模式下为 undefined
- 用 new 调用,this 指向新创建的实例
- 用 call/apply/bind 显式传参,this 就是你指定的对象
箭头函数:this 在定义时就继承外层
箭头函数没有自己的 this,它直接“抄作业”——取定义位置所在作用域的 this 值,之后永不改变:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 如果写在某个对象方法内部(如 obj.greet = () => {...}),它的 this 就是那个方法执行时的 this(通常是 obj)
- 如果写在全局作用域,它就继承全局 this(浏览器中是 window)
- call/apply/bind 对它无效,强行传 this 参数不会覆盖词法继承的结果
一个典型对比示例
下面代码能直观体现差异:
const obj = { name: 'Alice' };obj.normal = function() { console.log(this.name); }; // this 由调用决定
obj.arrow = () => { console.log(this.name); }; // this 继承自定义时的外层(这里是全局)
obj.normal(); // 'Alice'
obj.arrow(); // undefined(因为全局 this 没有 name 属性)
怎么快速判断该用哪个
看你要不要控制 this 的来源:
- 需要动态绑定 this(比如作为事件处理器、构造函数、或要被 bind/call 调用)→ 用普通函数
- 只是写个回调、映射逻辑、异步操作,且希望 this 和外层保持一致 → 用箭头函数
- 不确定?先问自己:“这个函数执行时,this 应该是谁?” 如果答案依赖调用方式,就别用箭头函数
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










