TypeScript 4.4.x编译导入函数生成(0,fn)()逗号表达式的原因是什么?
编译逻辑调整的核心原因
这个改动是TypeScript 4.4为了对齐ES模块规范的原生执行行为,修复历史版本的实现偏差做的针对性优化,具体逻辑如下:
- ES模块规范明确规定:模块内顶层调用导出函数时,函数内部的
this值为undefined(严格模式下) - 4.3及更早版本的TypeScript编译CommonJS模块时,直接生成
doOnMediaChange_1.onMediaChangeSubscribe(this.render)的调用逻辑,这种写法会把被调用函数的this绑定到导入的模块对象doOnMediaChange_1上,和原生ES模块的执行行为完全不一致,可能导致函数内部依赖this的逻辑出现非预期错误 - 4.4版本引入的
(0, doOnMediaChange_1.onMediaChangeSubscribe)(this.render)写法,利用了JavaScript逗号表达式的特性:逗号表达式会返回最后一个操作数的取值,同时丢失函数的上下文绑定,此时调用函数的this就和原生ES模块一样为undefined,完全对齐规范行为
内容的提问来源于stack exchange,提问作者Anton Matiash
相关产品推荐
相关产品推荐

