话不多说,直接干货,此次是想介绍一种纯基于js的方式来去除一种较为容易的控制流。先上代码:
可以看到函数体内部利用for语句和switch语句增加了阅读难度,而debug的时候更是恶心,所以我们迫切需要剥掉冗余的外壳,去伪存真。
抽象语法树,简称AST,将JS代码抽象成树状结构,然后通过对树的“修剪”,最终实现简化代码的作用。
之前用estraverse和esprima做过一些,但是浅尝辄止。最近认真看了蔡老板的星球,所以又再度重拾AST的使用,确实轻松许多。
babel,号称The compiler for next generation JavaScript,真不是白给的,确实好用,至于具体的安装过程...此文忽略...自行百度。
在安装好之后,一般需要调用下面几个工具:
“parse”是用来将js代码抽象为语法树;
“generator”将语法树还原为js代码
“traverse”用来遍历语法树,从而进行修改,是最为核心的工具。
“types”主要是在修剪AST的过程中判断各种语法的类型
理论说完,直接代码:
将函数变为文本赋给str_code
利用parse将文本转化为语法树ast
接下来也是最核心的地方,设置遍历时的修剪条件
visitor是对AST的所有操作逻辑和流程,简单言说就是当遇到“FunctionDeclaration”类型的节点时候,通过各种条件的设置,来筛选出你想要修改的特定函数体,比如需要满足在函数体内部有for循环模块,有switch模块,switch中cases的数量等等条件,当全部满足的时候,就我们要做手术的函数体,之后再通过各种设置,最终将节点按照自己的所想的方式实现出来。
traverse是按照既定的逻辑流程来遍历修剪语法树对象ast。
generator将修剪后的ast还原成js代码。
具体效果如何,我们打印代码:
可以看到,清除了控制流,逻辑清爽直观了许多,里面还有很多可以修剪的地方,但不是此次的重点,有兴趣的可以自己尝试一下。
如果你能理解这个简单的控制流,那么在熟练使用之后,当遇到难度加大的,我相信只要耐下心来就可以一点点实现。
今天介绍的是一种极为优雅、清爽且专业的js实现方式,那么有没有python可以实现的呢?答案是必须的,甚至我觉得在用python实现之后,成就感甚至更高那么一点点,下次再做介绍。