箭头函数的this在定义时就锁定为外层词法环境的this值,无法通过call/apply/bind改变,也不可作为构造函数使用;普通函数则每次调用时根据调用者动态绑定this。

箭头函数的 this 不依赖执行时的调用方式,而是完全依赖它被定义时所在的词法环境(也就是外层普通函数或全局作用域的 this 值)。
箭头函数的 this 在定义时就已锁定
它不会因为后续如何调用而改变。哪怕把箭头函数赋值给另一个对象、传入回调、或用 call/apply/bind 显式绑定,都无效。
- 普通函数:每次调用时根据“谁调用”动态决定 this
- 箭头函数:定义那一刻,就从外层作用域“抄走”了当时的 this,之后永远不变
- 如果外层没有普通函数(比如直接在全局写箭头函数),那它的 this 就是全局对象(浏览器中为 window,严格模式下为 undefined)
常见依赖场景举例
箭头函数的执行环境依赖,本质是看它写在哪一层作用域里:
- 写在某个对象方法内部 → 继承该方法执行时的 this(即该对象)
- 写在构造函数内部 → 继承构造函数执行时的 this(即新实例)
- 写在定时器或事件回调里(且外层是普通函数)→ 继承外层函数的 this,不是触发事件的对象
- 嵌套多层箭头函数 → 每一层都沿用最靠近的非箭头函数作用域的 this
为什么不能用 call / apply / bind 改 this
因为箭头函数根本没有自己的 this 绑定机制,它连 this 的“槽位”都不占。这些方法只对普通函数生效,对箭头函数调用相当于什么都没做。
-
fn.call(obj)对普通函数有效;对箭头函数,this 仍按定义位置继承 -
fn.bind(obj)返回的新函数仍是箭头函数(如果原函数是箭头函数),this 不变 - 试图在箭头函数里写
new会直接报错 —— 它没有 [[Construct]] 内部方法
实际开发中的典型依赖链
看一段典型代码就能明白依赖关系怎么传递:
- 全局作用域:
const fn = () => console.log(this)→ this 是window - 对象方法中:
obj.method = function() { const inner = () => console.log(this); inner(); }→ this 是obj - 类方法中:
class C { handler() { setTimeout(() => console.log(this), 100); } }→ this 是当前实例,不会丢失
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











