zoukankan      html  css  js  c++  java
  • 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而用其他方式模拟反而会带来更大的开销。









    —— FROM WNL
  • 相关阅读:
    八款前端开发人员更轻松的实用在线工具
    HTML5中的Web Notification桌面通知(右下角提示)
    老司机程序员用到的各种网站整理
    JAVA变量存储
    关于JAVA中的前期绑定 后期绑定(动态绑定)
    i MySQL 查看约束,添加约束,删除约束
    final static
    MySQL alter语句
    MySQL 权限生效
    MySQL 用户权限管理
  • 原文地址:https://www.cnblogs.com/yinn/p/7504652.html
Copyright © 2011-2022 走看看