eval()的Javascript替代

时间:2018-09-21 22:09:39

标签: javascript eval

eval()完全满足我的要求,但是当我查看MDN中的文档时,它说

  

永远不要使用eval!   eval()是一个危险的函数,它以调用者的特权执行它传递的代码。如果使用可能受到恶意方影响的字符串运行eval(),则最终可能会在网页/扩展名的许可下在用户计算机上运行恶意代码。更重要的是,第三方代码可以看到eval()的调用范围,从而可能导致类似功能不易受到攻击的攻击。<​​/ p>      

eval()的速度也比其他方法慢,因为它必须调用JS解释器,而许多其他结构是由现代JS引擎优化的。

     

此外,现代的javascript解释器将javascript转换为机器代码。这意味着任何变量命名的概念都将被废除。因此,任何对eval的使用都将迫使浏览器进行长时间的昂贵的变量名查找,以找出变量在机器代码中的位置并设置其值。另外,可以通过eval()向该变量引入新事物,例如更改该变量的类型,迫使浏览器重新评估所有生成的机器代码以进行补偿。但是,(值得庆幸的),有一个非常好的替代eval的方法:只使用window.Function。作为一个示例,说明了如何使用邪恶的eval()将代码转换为使用Function()。

什么对我来说是更好的选择。我的代码就像:

let aCount=0;
let bCount=0;

addCount=(option)=>{ //option either a or b
    const choice=eval(option+"Count"); // then combine to aCount or bCount
    choice++;
}

addCount(a);//aCount=1;
addCount(a);//aCount=2;
addCount(b);//bCount=1;
addCount(b);//bCount=2;

我之前尝试过window [variable],但没有返回值 我做不到

const choice=window[option+"Count"]

它将返回未定义。 而且我需要多次调用choice,所以我无法重复window [variable]。

1 个答案:

答案 0 :(得分:0)

除“ eval”外,示例代码中还有一些错误,我将不为您解释。

现在,在您的示例中,我们重点介绍“评估”。如果这样做,您将发现它根本不起作用。您只能像eval(option + "Count++")那样做,而不是将aCount / bCount的值分配给(CONST!)变量,然后增加该变量。以下代码有逻辑问题:

let c = aCount;
c++; // aCount not changed

我认为,只要传递给“ eval”的代码绝对受信任,就可以在某些特殊情况下使用“ eval”。在您的示例代码中,它符合此规则。 (但是,除安全性外,“评估”还存在性能问题。)

当然,您还有其他更好的选择,可以避免使用“ eval”。例如,使用if / else或switch / case:

addCount=(option)=>{
    if (option === 'a') aCount++;
    else if (option === 'b') bCount++;
}

或者,您可以使用一个对象来保存所有变量:

let obj = {aCount: 0, bCount: 0};
addCount=(option)=>{
    obj[option + "Count"]++;
}