前言
相信大家对 自执行函数 并不陌生,在混淆的代码中随处可见。如下图:
而在代码块里面的作用域和在自执行函数外的作用域是相同的,因此,如果自执行函数如果没有参数的话,可以进行简化。去掉烦人的:
-
!(function()
-
{
-
somecode;
-
})();
插件功能
优化无实参的自执行函数
处理实例
处理前:
-
!(function()
-
{
-
a = b;
-
})();
处理后:
a = b;
插件源码
-
const types = require("@babel/types");
-
const simplify_auto_exec = {
-
UnaryExpression(path)
-
{
-
let {operator,argument} = path.node;
-
if (operator != "!" || !types.isCallExpression(argument)) return;
-
let {arguments,callee} = argument;
-
if (arguments.length !=0 || !types.isFunctionExpression(callee)) return;
-
-
let {id,params,body} = callee;
-
if (id != null || params.length !=0 || !types.isBlockStatement(body)) return;
-
path.replaceWithMultiple(body.body);
-
},
-
}
思路
-
其实就是将函数体里面的内容替换整个表达式
-
-
-
1.因为是替换表达式,因此这里遍历UnaryExpression节点,这个可以在对照网站看的很清楚。
-
2.特征判断,UnaryExpression表达式的operator节点为符号"!";而argument节点是CallExpression类型
-
3.再次对argument节点进行特征判断,具体见代码。
-
4.满足条件后进行替换。
注意事项
内嵌同类型的UnaryExpression表达式同样可以进行替换。代码无需修改。
结语
某著名前端滑块的js代码,大量的使用了这种类型的表达式,其实只需要这么几行代码就可以将函数外层的代码脱掉,看起来会稍微清晰一点。
写插件的通用套路就是先判断特征,再进行处理,当然,大多数情况下都是对字面量的处理。
文章来源: blog.csdn.net,作者:悦来客栈的老板,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/qq523176585/article/details/109568058