解密 【JavaScript Eval】不为人知的秘密

   eval() 可以说是整个ECMAScript语言中最强大的一个方法。eval()方法就像是一个完整的ECMAScript解析器,它只接受一个参数,既要执行的ECMAScript字符串。

请看下面的例子:  

eval("alert(‘hello’)"); 

 这行代码的作用等价于下面这行代码:

 alert("hello");

   当解析器发现代码中调用了eval()方法是,他将会传入的参数当作实际的ECMAScript语句来解析,然后把执行结果插入到原位置。通过

eval() 执行的代码被认为是包含该次调用的执行环境的一部分,因此被执行的代码具有与该执行环境相同的作用域链。这意味着通过eval()执行的代码可以引用在包含环境中定义的变量,举个例子。

var msg="hello world";
eval("alert(''msg)");  //"hello world"
可见,变量msg是在eval() 调用的环境之外定义的,但其中调用alert()仍然能够显示 hello world 。 这是因为上面第二行代码最终被替换成了一行真正的代码。同样地,我们也可以在eval()调用中定义一个函数,然后再在该调用的外部代码中引用这个函数;

eval("function test(){ alert('hello');}");


test(); 
显然,函数test()是在eval()内部定义的。但由于对eval()的调用最终会被替换成定义函数的实际代码,因此可以在下一行调用test();

特别提示:

     能够解释代码字符串的能力非常强大,但也非常危险,因此在使用eval()时必须极为谨慎,特别是在用它执行用户输入数据的情况下,否则,可能会有恶意用户输入威胁你的站点或应用程序安全的代码(即所谓的代码注入


  

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值