凭借JavaScript的灵活性,我们可以编写充满副作用的代码,或者只是纯粹的功能。
我一直对功能JavaScript很感兴趣,并希望在这个范例中启动一个项目。关于这一点的麻烦肯定能帮助我收集好的做法。是否有任何一种能够强制实现纯功能和副作用的自由风格?
答案 0 :(得分:3)
纯度分析等同于解决暂停问题,因此在一般情况下,任何可以确定代码是纯粹还是不纯的静态分析都是不可能的。无论是否纯粹,总会有无数的程序是不可判定的;其中一些程序是纯粹的,有些是不纯的。
现在,你故意使用术语“linter”而不是静态分析器(虽然当然linter只是一个静态分析器),这似乎意味着你可以使用近似的启发式结果。你可以有一个有时会告诉你你的代码是纯粹的,有时告诉你你的代码是不纯的,并且大多数时候告诉你它无法决定你的代码是纯粹的还是不纯的。并且您可以拥有已知纯粹的操作白名单(例如,使用Number
运算符添加两个+
),以及已知不纯的操作黑名单(例如,任何可以抛出一个异常,任何类型的循环,if
语句,Array.prototype.forEach
)并对它们进行启发式扫描。
但最终,结果将太不可靠,无法对他们做任何严肃的事情。
答案 1 :(得分:2)
我自己没有使用过这个,但我找到了ESLint的这个插件:https://github.com/jfmengels/eslint-plugin-fp
答案 2 :(得分:0)
如果没有副作用,则无法完全使用JS。每个DOM访问都是一个副作用,我们可能会有一个争论,整个全局命名空间也可能属于该定义。
你能做的最好的事情就是保持合理。我将其逻辑分为两组:
工作马(实用工具):他们的目的是获取一些数据并以某种方式处理它。这些(大多数)副作用是免费的。大多数情况下,因为某些时候这些功能需要一些状态,比如计数器或缓存,这可能被认为是一种副作用,但由于它被隔离/封闭在这些功能中,我并不十分关心。
就像您传递给DiskCacheStrategy.NONE
或承诺Array#map()
以及类似地方的功能一样。
和管理:这些函数很少自己做一些数据处理,它们主要编排数据流,从创建数据流到任何必须运行的处理(-utilities),直到结束的地方,比如修改DOM或改变对象。
then()
使所有功能尽可能简短。并且不要害怕描述性的名称(不像通用的那样:))