在JavaScript中警告副作用的任何短信?

时间:2017-02-03 12:08:19

标签: javascript functional-programming eslint

凭借JavaScript的灵活性,我们可以编写充满副作用的代码,或者只是纯粹的功能。

我一直对功能JavaScript很感兴趣,并希望在这个范例中启动一个项目。关于这一点的麻烦肯定能帮助我收集好的做法。是否有任何一种能够强制实现纯功能和副作用的自由风格?

3 个答案:

答案 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()

使所有功能尽可能简短。并且不要害怕描述性的名称(不像通用的那样:))