javaScript 避免使用eval

如果你现在的代码中使用了eval(),记住该咒语"eval()是魔鬼".此方法接受任意的字符串,并当作javaScript代码来处理。当有问题的代码是事先知道的(不是运行时确定的),如果代码是运行时动态生成,有一个更好的方式不使用eval而达到同样的目标。

例如,用方括号表示法来访问动态属性会更好更简单:

var property="name";

 alert(eval("obj."+property));

 alert(obj[property]);

使用eval也带来了安全隐患,因为被执行的代码(例如从网络来)可能已被篡改。

当处理Ajax请求得到JSON相应的时候,一般情况下,最好使用javaScript内置方法来解析JSON相应,以确保安全和有效。

例如:

  1.

    var data="{root:[{name:'1',value:'0'},{name:'a',value:'b'}]}"

    objdata=eval("("+data+")");

  最好不要使用eval,在请求时候利用jquery中$.getJSON()来获得服务器返回,

  2.

    $.getJSON("url",{action:"aa"},function(result){

      $.each(data.root,function(i,item)

      {

        //循环

        alert(item[i].name);

      });

    });

  3.

    var dataobj=(new Function("","return"+data"))();

    同样能达到$.getJSON一样的效果。

同样重要的是要记住,给setInterval(),setTimeout()和Function()构造函数传递字符串,大部分情况下,与使用evaL()是类似的,因此

要避免。在幕后,javascript仍需要评估和执行你给程序传递的字符串:

  //反面示例

  setTimeout("myFunc()",1000);

  setTimeout("myFunc(1,2,3)",1000);

  //更好的

  setTimeout(myFunc,1000);

  setTimeout(function(){

    myFunc(1,2,3);

  },1000);

使用新的Function()构造就类似于eval(),应小心接近。这可能是一个强大的构造,但往往被误用。如果你绝对必须使用eval(),你可以考虑使用

new Function()代替。有一个小的潜在好处,因为在新Function()中作代码评估是在局部函数作用域中运行,所以代码中任何被评估的通过var

定义的变量都不会自动变成全局变量,另一种方法来阻止自动全局变量是封装eval()调用到一个即时函数中.

  考虑下面这个例子,这里仅un作为全局变量污染了命名空间。

  alert(typeof un);//undefined

  alert(typeof deux);//undefined

  alert(typeof trois);//undefined

  var jsstring="var un=1; alert(un)";

  eval(jsstring);

  jsstring="var deux=2; alert(deux)";

  new Fuction(jsstring);

  jsstring="var trois=3;akert(trois)";

  (function(){

    eval(jsstring);

  }());

  alert(typeof un);//number;

  alert(typeof deux);//undefined;

  alert(typeof trois);//undefined;

另一间eval()和Function构造不同的是eval()可以干扰作用域链,而Function更安分守已些。不管你在哪里执行Function(),它只看到全局作用域。所以期能很好的避免本地变量污染。在下面这例子中,eval()可以访问和修改它外部作用域中的变量,这是Function做不来的(注意到使用Function和new Function是相同的)。

    (fucntion(){

      var local=1;

      eval("local=3;alert(local)"); //3

      alert(local);//3

     }());

    (function(){

      var local=1;

      Function("alert(local);")();//undefinde

    });