eval与window.eval的差别分析


Posted in Javascript onMarch 17, 2011

它们之间有区别吗?

开发过程中似乎很少有人去加个额外的window,觉得多此一举。比如Ajax过程中回调函数解析JSON格式字符串

... 
function callback(str){ 
var json = eval('(' + str + ')'); 
} 
...

通常直接使用eval,而非var json = window.eval('(' + str + ')');
又比如调试时使用alert,很少有人使用window.alert;IE中获取事件对象使用event,很少有人使用window.event。(Firefox中在某些情况下也支持event而不支持window.event。感兴趣的同学看看这篇 获取事件对象的全家)

但由于各个引擎实现差异,它们的区别还是有的。

var x = 5; 
function fn(){ 
var x = 'jack'; 
eval('x=10;'); 
} 
fn(); 
alert(x); // -->5

所有浏览器中输出的都是5,说明调用fn后eval修改的是fn内的局部变量x,而非全局的x。即eval执行的闭包环境是在fn内。

修改下,把以上代码的eval换成window.eval,测试后发现各个浏览器中的表现不一样了。

IE6/7/8 : 仍然输出5,即没有修改全局变量x,修改的仍然是局部变量x。
IE9/Firefox/Safari/Chrome/Opera : 输出10,修改的是全局变量x。

可以得出结论了
IE6/7/8中,eval和window.eval一样,写在自定义函数内是局部闭包,否则是全局闭包。
IE9/Firefox/Safari/Chrome/Opera中,eval同以上IE6/7/8,window.eval即使写在自定义函数内使用的也是全局闭包。

此外:IE中的window.execScript总是在全局闭包下执行,令人惊奇的是Chrome也支持该方法。呵,Chrome策略是标准,IE一个不能少。

Javascript 相关文章推荐
深入理解JavaScript系列(1) 编写高质量JavaScript代码的基本要点
Jan 15 Javascript
jQuery点击tr实现checkbox选中的方法
Mar 19 Javascript
javascript跟随滚动效果插件代码(javascript Follow Plugin)
Aug 03 Javascript
千分位数字格式化(用逗号隔开 代码已做了修改 支持0-9位逗号隔开)的JS代码
Dec 05 Javascript
jquery动态加载select下拉框示例代码
Dec 10 Javascript
简介JavaScript中strike()方法的使用
Jun 08 Javascript
jquery控制显示服务器生成的图片流
Aug 04 Javascript
JS仿百度自动下拉框模糊匹配提示
Jul 25 Javascript
bootstrap multiselect下拉列表功能
Aug 22 Javascript
vue集成百度UEditor富文本编辑器使用教程
Sep 21 Javascript
Javascript和jquery在selenium的使用过程
Oct 31 jQuery
jQuery实时统计输入框字数及限制
Jun 24 jQuery
整理一些JavaScript的IE和火狐的兼容性注意事项
Mar 17 #Javascript
jquery.validate分组验证代码
Mar 17 #Javascript
jquery中ajax调用json数据的使用说明
Mar 17 #Javascript
jQuery版Tab标签切换
Mar 16 #Javascript
jquery select(列表)的操作(取值/赋值)
Mar 16 #Javascript
jquery radio 操作代码
Mar 16 #Javascript
ajax更新数据后,jquery、jq失效问题
Mar 16 #Javascript
You might like
mysql 的 like 问题,超强毕杀记!!!
2007/01/18 PHP
深入file_get_contents函数抓取内容失败的原因分析
2013/06/25 PHP
用PHP和Shell写Hadoop的MapReduce程序
2014/04/15 PHP
thinkPHP5.0框架开发规范简介
2017/03/25 PHP
学习YUI.Ext基础第一天
2007/03/10 Javascript
基于jQuery的试卷自动排版系统实现代码
2011/01/06 Javascript
JavaScript 对任意元素,自定义右键菜单的实现方法
2013/05/08 Javascript
js获得地址栏?问号后参数的方法
2013/08/08 Javascript
js简单实现标签云效果实例
2015/08/06 Javascript
BootStrap Datepicker 插件修改为默认中文的实现方法
2017/02/10 Javascript
使用原生的javascript来实现轮播图
2017/02/24 Javascript
JS二叉树的简单实现方法示例
2017/04/05 Javascript
vue2.x 父组件监听子组件事件并传回信息的方法
2017/07/17 Javascript
js 判断一个数字是不是2的n次方幂的实例
2017/11/26 Javascript
layui中table表头样式修改方法
2018/08/15 Javascript
JS 自执行函数原理及用法
2019/08/05 Javascript
Vue-drag-resize 拖拽缩放插件的使用(简单示例)
2019/12/04 Javascript
[04:22]DSPL第二期精彩集锦:残血反杀!
2014/12/10 DOTA
[03:04]2018年度DOTA2玩家最喜爱的主播-完美盛典
2018/12/16 DOTA
[36:09]Secret vs VG 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.24
2019/09/10 DOTA
python简单程序读取串口信息的方法
2015/03/13 Python
Python中生成器和yield语句的用法详解
2015/04/17 Python
Python的地形三维可视化Matplotlib和gdal使用实例
2017/12/09 Python
Python实现爬虫从网络上下载文档的实例代码
2018/06/13 Python
python3连接kafka模块pykafka生产者简单封装代码
2019/12/23 Python
Django执行源生mysql语句实现过程解析
2020/11/12 Python
HTML5 Canvas+JS控制电脑或手机上的摄像头实例
2014/05/03 HTML / CSS
欧洲高端品牌直销店:Fashionesta
2016/08/31 全球购物
美国顶级水上运动专业店:Marine Products
2018/04/15 全球购物
Java面试题及答案
2012/09/08 面试题
建筑工程技术应届生自荐信
2013/09/27 职场文书
办公室主任职责范文
2013/11/08 职场文书
购房协议书范本
2014/04/11 职场文书
岗位工作说明书
2014/07/29 职场文书
Python基础之字符串格式化详解
2021/04/21 Python
Python3.10的一些新特性原理分析
2021/09/15 Python