箭头函数中this指向与Babel编译输出的差异及原因咨询
为什么Babel编译箭头函数后
this的输出会变化? 这问题问到点子上了!核心差异来自箭头函数的词法this规则和Babel编译时的严格模式处理,咱们一步步掰明白:
1. 原生箭头函数的this逻辑
先看你写的原生代码:
(()=>{ console.log(this); })()
箭头函数的最大特性之一就是没有自己的this,它的this是从定义时的**外层作用域“继承”**来的。在浏览器的全局环境下执行这段代码时,外层作用域就是全局作用域,这里的this指向Window对象,所以最终输出Window——哪怕你给这段代码套上严格模式,箭头函数的this依然会捕获全局的Window,因为它的词法绑定不受调用时的严格模式影响。
2. Babel编译后的代码为什么输出undefined?
Babel把箭头函数转译成了带严格模式的普通函数:
"use strict"; (function () { console.log(undefined); })();
这里有两个关键:
- 严格模式的影响:在严格模式下,普通函数如果是独立调用(既不是作为对象的方法,也不是用
new、call/apply绑定this),它的this会被绑定为undefined,而非全局对象。 - Babel的转译策略:为了尽可能贴近ES6模块的默认行为(ES6模块默认开启严格模式,顶层箭头函数的
this就是undefined),Babel默认会给转译后的代码加上严格模式。它试图用普通函数+严格模式的组合,模拟箭头函数在现代模块环境下的this行为,但这就和原生箭头函数在全局非严格模式下的输出产生了差异。
说白了,Babel不是1:1复刻全局环境下的箭头函数行为,而是优先适配现代JS的规范场景(模块),所以才会出现这种输出不一致的情况。如果非要让转译后的代码在全局输出Window,你可以调整Babel配置关闭严格模式,但这并不推荐,因为不符合现代JS的编码规范。
内容的提问来源于stack exchange,提问作者Gaurav Chaudhary
相关产品推荐
相关产品推荐

