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 相关文章推荐
JQuery团队打造的javascript单元测试工具QUnit介绍
Feb 26 Javascript
各浏览器中querySelector和querySelectorAll的实现差异分析
May 23 Javascript
解决jquery的datepicker的本地化以及Today问题
May 23 Javascript
前台js改变Session的值(用ajax实现)
Dec 28 Javascript
css transform 3D幻灯片特效实现步骤解读
Mar 27 Javascript
使用jquery animate创建平滑滚动效果(可以是到顶部、到底部或指定地方)
May 27 Javascript
JavaScript数据类型之基本类型和引用类型的值
Apr 01 Javascript
基于jQuery Bar Indicator 插件实现进度条展示效果
Sep 30 Javascript
简单实现限制uploadify上传个数
Nov 16 Javascript
ES6/JavaScript使用技巧分享
Dec 14 Javascript
原生JavaScript实现的简单放大镜效果示例
Feb 07 Javascript
详解项目升级到vue-cli3的正确姿势
Jan 28 Javascript
整理一些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
PHP格式化MYSQL返回float类型的方法
2016/03/30 PHP
CI框架文件上传类及图像处理类用法分析
2016/05/18 PHP
php代码检查代理ip的有效性
2016/08/19 PHP
PHP设计模式之单例模式定义与用法分析
2019/03/26 PHP
基于PHP实现解密或加密Cloudflar邮箱保护
2020/06/24 PHP
Javascript中产生固定结果的函数优化技巧
2013/01/16 Javascript
jquery与js函数冲突的两种解决方法
2013/09/09 Javascript
基于jQuery实现的向下滑动二级菜单效果代码
2015/08/31 Javascript
JavaScript过滤字符串中的中文与空格方法汇总
2016/03/07 Javascript
AngularJS ng-bind-template 指令详解
2016/07/30 Javascript
微信小程序  网络请求API详解
2016/10/25 Javascript
JS 全屏和退出全屏详解及实例代码
2016/11/07 Javascript
微信小程序开发之视频播放器 Video 弹幕 弹幕颜色自定义实例
2016/12/08 Javascript
Vue AST源码解析第一篇
2017/07/19 Javascript
React Native 自定义下拉刷新上拉加载的列表的示例
2018/03/01 Javascript
Bootstrap 模态框自定义点击和关闭事件详解
2018/08/10 Javascript
Node.js 获取微信JS-SDK CONFIG的方法示例
2019/05/21 Javascript
[43:57]Liquid vs Mineski 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
使用python绘制人人网好友关系图示例
2014/04/01 Python
python爬取网易云音乐评论
2018/11/16 Python
解决Pycharm界面的子窗口不见了的问题
2019/01/17 Python
Python3.7 dataclass使用指南小结
2019/02/22 Python
python中的colorlog库使用详解
2019/07/05 Python
python+rsync精确同步指定格式文件
2019/08/29 Python
python实现小程序推送页面收录脚本
2020/04/20 Python
Django REST Framework 分页(Pagination)详解
2020/11/30 Python
英国安全产品购物网站:The Safe Shop
2017/03/20 全球购物
莫斯科绝对前卫最秘密的商店:SVMoscow
2017/10/23 全球购物
澳大利亚现代波西米亚风格女装网站:Bohemian Traders
2018/04/16 全球购物
DERMAdoctor官网:美国著名皮肤护理品牌
2019/07/06 全球购物
进程的查看和调度分别使用什么命令
2015/03/25 面试题
倡议书的格式写法
2015/04/28 职场文书
城镇居民医疗保险工作总结
2015/08/10 职场文书
社交电商模式的兴起:这些新的商机千万别错过
2019/07/26 职场文书
InterProcessMutex实现zookeeper分布式锁原理
2022/03/21 Java/Android
动态规划之使用备忘录来改进Javascript函数
2022/04/07 Javascript