一、问题产生
本人在写一个用户可以自定义编写代码逻辑的软件。对于某个代码块,需要执行用户自己编写的javascript代码(字符串),自然而然的就用到了eval。对此我声明了一个处理类,主要逻辑函数如下。
export default class DBCCondition extends ConditionBase {
constructor(past_results, cdata) {
this.cdata = cdata;
}
//--过滤组合
filter(result) {
let isok =true;
eval(this.cdata.functions.filter);
return isok;
}
};
对于this.cdata.functions.filter
这个是用户自己编写的字符串代码,根据result的值,对isok
属性进行修改。
//--filter的一个值如下
filter:"isok = result.getBlueSum() > 10"
实际环境中,DBCCondition
类对象函数filter
会被调用数以百万次。对于eval,我发现每次调用浏览器都会去分配一段内存去执行内部代码。自然而然,数以百万次的eval调用,2个G的浏览器内存会被瞬间吃光。导致进程卡死,无法进行我接下来的处理逻辑。