TypeScript Lambda与JS函数差异及Mocha中使用可行性问询
Mocha中TypeScript箭头函数的使用误区与澄清
先直接给你明确结论:TypeScript的箭头函数(Lambda)和JavaScript的箭头函数行为完全一致——它们都会对this做词法绑定,所以在Mocha里使用时,同样没法访问Mocha的上下文对象。而且不管是过去还是现在,二者的这个特性都没有差异。
为什么Mocha不推荐用箭头函数?
Mocha的describe、it这些测试钩子,是通过动态绑定this来提供上下文能力的——比如你想设置测试超时的this.timeout()、跳过测试的this.skip(),都得依赖这个上下文。但箭头函数的this是在定义时就绑定死的(绑定到它外层作用域的this),Mocha没办法修改这个绑定,所以你写下面这种代码肯定会报错:
describe('my suite', () => { it('my test', () => { // 这里的this不是Mocha的上下文,调用timeout会失败 this.timeout(1000); assert.ok(true); }); });
那箭头函数完全不能用吗?
也不是。如果你的测试逻辑完全不需要Mocha的上下文功能——比如只是简单的断言,不需要修改超时、跳过测试这些操作,那用箭头函数确实能让代码更简洁,也能正常运行。但这里有个需要注意的点:
- 万一后续你要添加依赖上下文的逻辑,就得把所有箭头函数改成普通函数,重构成本不低
- 团队协作时,统一使用普通函数能减少新人踩坑的概率,降低认知负担
关于“TypeScript箭头函数早于JavaScript”的澄清
你提到的TypeScript箭头语法早于ES6正式推出箭头函数确实是事实,但从行为上来说,TypeScript从一开始就是对齐ES6规范来实现箭头函数的——词法绑定this是它的核心特性,从来没有出现过不绑定this的版本。所以不管是过去还是现在,在Mocha里用TypeScript箭头函数,都会遇到和JavaScript一模一样的上下文问题。
内容的提问来源于stack exchange,提问作者Ryan Leach




