zoukankan      html  css  js  c++  java
  • 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

        });

  • 相关阅读:
    System.setProperty()
    ExtJs自学教程(1):一切从API開始
    【福利!】英雄联盟国服更新补丁速度极慢的解决方法
    ORACLE触发器具体解释
    我的Hook学习笔记
    Runood-JSP:JSP 客户端请求
    Runoob-JSP:JSP 隐式对象
    Runoob-JSP:JSP 动做元素
    Runoob-JSP:JSP 指令
    Runoob-JSP:JSP 生命周期
  • 原文地址:https://www.cnblogs.com/jzhou/p/3198460.html
Copyright © 2011-2022 走看看