[转] eval 的使用

编程技术  /  houtizong 发布于 3年前   132
eval(str)是把传入的str当做脚本来执行,如果直接调用eval(),作用域为当前作用域。

function accumulate() {  var i = 1;  eval("var i = 3;");  document.writeln(i);}accumulate();


执行结果:3

如果改成window.eval():

function accumulate() {  var i = 1;  window.eval("var i = 3;");  document.writeln(i);}accumulate();


在不同的浏览器上结果不同:

浏览器 IE IE IE Firefox Chrome Chrome Safari Opera
版本 7.0 8.0 9.0 3.5.5 1.0 4.0 4.0.2 9.62
运行结果 3 3 1 3 1 1 1


可见各浏览器及版本对window.eval()的作用域处理是有差异的。

IE中,window.eval()和eval()一样只在当前作用域生效。

Firefox,Safari,Opera中,直接调用eval()为当前作用域,window.eval()调用为全局作用域。

尤其值得注意的是,Google Chrome 的不同版本之间对于eval的处理也有差异。

如果需要全局作用域eval()的效果,就需要进行改进:

1. 使用IE专有的window.execScript()

   window.execScript(sExpression, sLanguage)
   这里的sExpression就是需要执行的脚本字符串,sLanguage是指使用哪种脚本语言:如javascript, vbscript或是其他任何安装过相应解释引擎的脚本如perl,python等。
   非IE内核不支持这个命令

   // To execute in global environmentfunction evalGlobal(strScript) {  if (window.execScript) window.execScript(strScript);  else window.eval(strScript);}


看起来,问题似乎圆满解决了。但是显然是有问题的,比如上表中的Chrome 1.0也和IE的eval()规则一致,况且还不知道其他浏览器其他版本是否有差异呢,因此,这种方法并不很可靠。

2. 新建一个<script>元素装载脚本

   // To execute in global environmentfunction evalGlobal(strScript) {  var s = document.createElement("script");  s.type = "text/javascript";  s.text = strScript;  document.getElementsByTagName("head")[0].appendChild(s);}


这个方法需要新增一个<script>元素,但优点是各种浏览器及版本通用,缺点是毕竟添加了一个HTML元素嘛,影响了页面原本的DOM结构。

3. 使用with

with可以改变上下文环境:

function evalGlobal(strScript) {  with (window) eval(strScript);}


特别

有时候,我们eval()要求既不是在全局执行,也不是在当前作用域执行,而是在父对象或子对象中执行,这时,用 with ( objContext )eval (strScript) 就更加是不可替代的选择了。


总结

让eval()全局作用域执行的方法主要有:

(1)window .execScript + window . eval    级别:弱。 缺点:不简洁,不可靠,不通用。

(2)document . createElement ("script" )    级别:凑合。缺点:不简洁,不干净。优点:可靠,通用。

(3)with ( objContext )eval (strScript)          级别:最佳。优点:简洁,干净,可靠,通用。

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

留言需要登陆哦

技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成

网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];

      订阅博客周刊 去订阅

文章归档

文章标签

友情链接

Auther ·HouTiZong
侯体宗的博客
© 2020 zongscan.com
版权所有ICP证 : 粤ICP备20027696号
PHP交流群 也可以扫右边的二维码
侯体宗的博客