现在的位置: 首页 > 综合 > 正文

Javascript中eval方法的应用及其问题。

2018年02月14日 ⁄ 综合 ⁄ 共 1468字 ⁄ 字号 评论关闭
  1. 认识eval()方法
    eval()是js Functions里面的一个方法。和其他很多解释性语言一样,JavaScript同样可以解释运行由JavaScript源代码组成的字符串,并产生一个值。JavaScript通过全局函数eval()来完成这个工作。eval()可以计算某个字符串,并执行其中的javascript代码。
  2. eval()的用法
    eval()方法只有一个参数,而且它只接受字符串作为这个参数,如果这个参数不是字符串,那么它将直接返回这个函数。如果该参数是一个函数,它会把字符串当成JavaScript代码进行编译,如果编译失败则抛出一个语法错误异常。如果编译成功,则开始执行这一段代码,并返回字符串中的最后一个表达式会或语句的值,如果最后一个表达式或语句没有值,则最终返回undefined。如果字符串抛出一个异常,这个异常将把该调用传递给eval()。
    这么讲可能有些费解,这里举几个例子:
    • <script type="text/javascript">
      eval("x=10;y=20;document.write(x*y)");//输出200
      document.write(eval("2+2"));                 //输出4
      var x=10
      document.write(eval(x+17));                  //输出27
      </script>
    • var operator = "+";
      var num1 = 12;
      var num2 = 12;
      window.alert(eval(num1+eval("operator")+num2))://输出24
      解释一下这段程序:里面的eval执行后是“+”,然后num1+num2作为字符串传给外层eval,结果为24.
    • 说明:
      1. 动态判断源代码中的字符串是一种很强大的语言特性,几乎没有必要在实际中应用。如果你使用了eval(),你应当仔细考虑是否真的需要使用它。你完全可以用其他方法实现这些功能。
      2. 作为参数的字符串必须是能够单独作为语句在程序里成功执行的,否则作为参数毫无意义。而且还会抛出异常。也就是说,如果字符串作为一个单独的脚本是有语义的,那么将其传递给eval作参数是完全没有问题的,否则,eval会抛出语法错误异常。
  3. eval()的问题
    • eval方法是在运行时对脚本进行解释执行,而普通的javascript会有一个预处理的过程。所以会有一些性能上的损失。但是这个倒是次要的。
    • eval()具有更改布局变量的能力,这对于JavaScript优化器来说是一个很大的问题。
      具体说来是这样:
      当脚本定义了eval的一个别名,且用另一个名称调用它,JavaScript解释器又会如何工作呢?为了让JavaScript解释器的实现更加简化,ECMAScript3标准规定了任何解释器都不允许对eval赋予别名。如果eval函数通过别名调用的话,则会抛出一个EavlError异常。实际上,大多数的实现并不是这么做的。当通过别名调用时,eval会将其字符串当成顶层的全局代码来执行。执行的代码可能会定义新的全局变量和全局函数,或者给全局变量赋值,但却不能使用或者修改主调函数中的局部变量,因此,这不会影响到函数内的代码优化。
  4. 几点建议
    • eval并不常用,一般能用别的方法实现,可不选择这种方法。
    • 当给eval传参数的时候,首次按确定这个参数是字符串;其次,确定该字符串代表的语句单独执行时是有意义的。
    • 不能将eval赋值给其他变量使用,即,不能用别的变量名称来引用eval;在这,自己的变量名称一定注意不要跟eval重复。

抱歉!评论已关闭.