• 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
  • 相关阅读:
    【luogu】P1772物流运输(最短路+DP)
    【Bzoj】1001狼抓兔子(平面图最小割转对偶图最短路)
    后记
    【Luogu】P2680运输计划(树上差分+二分)
    【Luogu】P2059卡牌游戏(概率DP)
    【Luogu】P2051中国象棋(DP)
    概率与期望学习笔记
    【Luogu】P2894酒店Hotel(线段树)
    21.Mysql Server优化
    20.Mysql锁机制
  • 原文地址:https://www.cnblogs.com/yinn/p/7504652.html
Copyright © 2020-2023  润新知