为什么生成器不能很好地转换?

Ian*_*Ian 5 javascript eslint airbnb-js-styleguide

我们正在遵循airbnbeslint 指南,其中他们说建议不要使用生成器

  • 11.2 现在不要使用生成器。

    为什么?它们不能很好地转换为 ES5。

我似乎无法找到任何关于它们不能很好地转换的含义的解释(不仅在本文档中,而且在 Google 上)。我们正在使用 babel 并且有 polyfills 可以做到这一点。有什么我想念的吗?

Tam*_*dus 4

他们根本就是错误的(或者文档已经严重过时了)。转译器从生成器和异步函数创建基于闭包的状态机。他们不友善,但工作速度很快。唯一的缺点是调试起来比较困难(即使使用源映射)。

另一方面,在某些情况下,不使用生成器会导致尴尬的解决方法,而生成器将提供干净的解决方案。始终首先编写代码以保持清晰。

编辑

我们开发人员在现实生活中了解到,一些编程挑战可以通过状态机得到最好的解决。生成器和异步函数为您提供了表达大多数状态机的强大工具。

这就是语言的演变过程:我们发现一个重复出现的编程问题有一个解决方案,因此人们创建了一种具有新语法的新编程语言,以便为该问题提供更短的解决方案。这就是我们如何获得基本数据结构、函数、闭包、类、一流函数、GC、RTTI、反射等......今天,它被认为是选择您的项目使用哪种语言的问题。您可以直接编写机器代码,或者使用一些高级托管语言。争论通常是关于执行速度(汇编应该更快,对吧?)、可移植性以及所使用的语言语法的学习曲线(当我总是能够解决任何问题时,为什么我要学习 lambda 、yield 和 async/await )不使用其中任何一个也会出现问题吗?)。我个人更喜欢使用表达性语言,并且我相信高级/托管程序永远不会比本机程序慢。

因此,让我强调一下不使用生成器会带来什么损失:您最终会编写相同的百行状态机(可能伪装成对象和函数的集合),这些状态机可以使用合理且熟悉的语法从短程序生成。