箭头函数的this在定义时词法绑定,继承外层第一个普通函数的this值,调用时不可改变;普通函数的this在调用时动态绑定,受调用方式影响。

箭头函数不绑定自己的 this,它会直接沿作用域链向上查找外层普通函数的 this 值——这不是编译器“特殊处理”的结果,而是语言规范定义的运行时行为,根本不存在传统意义上的“编译时绑定”。
箭头函数没有独立的 this 绑定机制
ES6 规范明确要求:箭头函数的 this 是词法绑定(lexical binding),即在函数定义时就确定,而非调用时。它不参与 JavaScript 的默认 this 绑定规则(如隐式绑定、显式绑定、new 绑定),也不受 call/apply/bind 影响。
- 定义时捕获外层第一个普通函数(或全局)的
this值,之后永远不变 - 即使把箭头函数赋值给对象属性再调用,
this仍指向定义时的外层上下文 - 在全局作用域中定义的箭头函数,其
this指向全局对象(浏览器中是window,严格模式下是undefined)
与普通函数的关键对比
普通函数的 this 在每次调用时才根据调用方式动态确定;箭头函数则完全跳过这一步,直接复用外层执行上下文的 this。
-
普通函数:
obj.method()→this指向obj;func.call(other)→this强制为other -
箭头函数:无论怎么调用,
this始终等于它被写在那里时,外层函数的this
常见陷阱与正确用法
容易误以为“箭头函数能自动绑定 this”,其实它只是“不改 this”,所以必须确保外层 this 已经是你想要的值。
立即学习“Java免费学习笔记(深入)”;
- 在类方法中使用箭头函数作为事件回调,可避免丢失实例
this(因为外层方法的this就是实例) - 不要在需要动态
this的场景(如 Vue 组件选项、jQuery 回调)中盲目替换为箭头函数,否则可能得到意外的this - 嵌套多层箭头函数时,
this仍只取决于最外层普通函数,不会逐层继承
Babel 等转译器如何处理
现代 JS 引擎(V8、SpiderMonkey)原生支持箭头函数,无需转译。Babel 在目标环境不支持时,会将其转为普通函数并手动捕获外层 this(例如用 var _this = this 保存,内部函数引用 _this)。
- 这种转换是语义等价的模拟,并非改变语言行为
- 转译后代码中出现的
_this变量,就是对词法this的显式实现 - 调试时看到的
this值,始终反映原始箭头函数定义位置的上下文


















