eval(function(p,a,c,k,e,d){e=function(c){return c};if(!''.replace(/^/,String)){while(c--)d[c]=k[c]||c;k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('1.3.0=1.2.0;',4,4,'Validator|THREECCRM|commonform|util'.split('|'),0,{}))
我正在分析的系统中有许多类似的代码,这是最短的一段。这段代码是在干什么?
把以上代码分解如下:
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
function (参数)
{
函数体
}
(实际参数)
后面的代码很多情况下我都一直以为是多此一举,如:定义函数e直接返回参数c;判断空字符替换空字符后是否为空字符;把数组k赋给数组d;把e定义为常量'\w+',然后只在一个地方使用;把c设为1,然后进行一次循环;未使用的形参a,e,d。
总之我把代码可以省略到如下,得出的结果是一致的:
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
现在大约可以理解,这段代码是把'1.3.0=1.2.0'用数组k[]替代,形成一个语句:
THREECCRM.util.Validator=THREECCRM.commonform.Validator;
然后执行。
d=[function(c){return k[c]}];这段代码我感觉像是返回k数组的指针。我试着用其它方式去取代这段代码,但都没成功。
取代1:
p=p.replace(new RegExp('\\b\\w+\\b','g'),k);
结果:
"Validator,THREECCRM,commonform,util.Validator,THREECCRM,commonform,util.Validator,THREECCRM,commonform,util=Validator,THREECCRM,commonform,util.Validator,THREECCRM,commonform,util.Validator,THREECCRM,commonform,util;"
取代2:
p=p.replace(new RegExp('\\b\\w+\\b','g'),'Validator|THREECCRM|commonform|util'.split('|'));
结果:
同上
取代3:
p=p.replace(new RegExp('\\b\\w+\\b','g'),k[0]);
结果:
"Validator.Validator.Validator=Validator.Validator.Validator;"
取代4:
p=p.replace(new RegExp('\\b\\w+\\b','g'),(k[0],k[1],k[2],k[3]));
结果:
"util.util.util=util.util.util;"
以后有时候再分析那些“多余”的代码究竟在什么时候产生作用的。