eval浅解

  eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。

  需要一个参数(string),切必需。要计算的字符串,其中含有要计算的 JavaScript 表达式或要执行的语句。

  1、只接受原始字符串作为参数,如果 string 参数不是原始字符串,那么该方法将不作任何改变地返回

var code1='"a" + 2'; //表达式 (字符串)
var code2={a:2}; //语句     (对象)
alert(eval(code1)); //'a2'
alert(eval(code2)); //[object Object],返回原对象
alert(eval('("' + code2 + '")')); //[object Object] ,此处括号是将对象转化为表达式

  2、间接调用eval 函数优于直接调用

  eval 函数有一个秘密武器,它不仅仅是一个函数。大多数函数只能访问定义它们所在的作用域,而不能访问除此之外的作域。

然而,eval 函数具有访问调用它那时的整个作用域的能力。这是非常强大的能力。当编译器编写者首次设法优化JavaScript 时,他

们发现eval 函数很难高效地调用任何一个函数,因为一旦被调用的函数是eval函数,那么每个函数调用都需要确保在运行时整个作

用域对eval 函数是可访问的。

  作为一种折中的解决方案,语言标准演化出了辨别两种不同的调用eval 函数的方法。函数调用涉及eval 标识符,被认为是一

种“直接”调用eval 函数的方式。

var x = "global" ;
function test(){
var x = "1ocal";
return eval ("x"); // direct eval
} test();//"local"

此时,直接调用eval函数,只具有调用局部作用域的权限。直接调用eval函数性能上的损耗是相当高的。

  另一种是“间接”调用eval 函数的方式。

var x = "global" ;
function test(){
var x = "1ocal";
var f = eval;
return f ("x"); // direct eval
} test();//"global"

这样,就可以避免把内部细节暴露给一些未授信者。

  除非有检查局部作用域的特别明确的需求,否则应当使用更不容易滥用、更廉价的间接调用eval函数的方式。

  3、关于eval

    1、容易被用错

    2、eval不容易调试

    3、关于安全性,我们经常听到eval是魔鬼,他会引起XSS攻击,实际上,如果我们对信息源有足够的把握时,eval并不会引起很大的安全问题。而且不光是eval,其他方式也可能引起安全问题。比如:

  莫名其妙给你注入一个<script src="">标签,或者一段来历不明的JSON-P请求,再或者就是Ajax请求中的eval代码…所以,只要你的信息源不安全,你的代码就不安全。不单单是因为eval引起的。

    4、效率问题是程序逻辑问题。对于一些有执行字符串代码需求的程序中,不用eval而用其他方式模拟反而会带来更大的开销。

上一篇:win2008 强制删除故障集群配置


下一篇:R语言实战(三)基本图形与基本统计分析