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与Ajax常用代码实现对比
Oct 03 Javascript
Ext.FormPanel 提交和 Ext.Ajax.request 异步提交函数的区别
Nov 12 Javascript
网页广告中JS代码的信息监听示例
Apr 02 Javascript
原生js的弹出层且其内的窗口居中
May 14 Javascript
JavaScript获取元素尺寸和大小操作总结
Feb 27 Javascript
jquery序列化方法实例分析
Jun 10 Javascript
JavaScript中实现Map的示例代码
Sep 09 Javascript
基于Bootstrap重置输入框内容按钮插件
May 12 Javascript
Bootstrap按钮功能之查询按钮和重置按钮
Oct 26 Javascript
$.browser.msie 为空或不是对象问题的多种解决方法
Mar 19 Javascript
vue通过点击事件读取音频文件的方法
May 30 Javascript
浅析JavaScript中的变量提升
Jun 01 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
写一个用户在线显示的程序
2006/10/09 PHP
怎样去阅读一份php源代码
2009/08/21 PHP
PHP 命令行工具 shell_exec, exec, passthru, system详细使用介绍
2011/09/11 PHP
php数字游戏 计算24算法
2012/06/10 PHP
THINKPHP2.0到3.0有哪些改进之处
2015/01/04 PHP
ThinkPHP模型详解
2015/07/27 PHP
php base64 编码与解码实例代码
2017/03/21 PHP
BOOM vs RR BO5 第一场 2.14
2021/03/10 DOTA
基于jquery实现的服务器验证控件的启用和禁用代码
2010/04/27 Javascript
jQuery UI AutoComplete 使用说明
2011/06/20 Javascript
JavaScript常用全局属性与方法记录积累
2013/07/03 Javascript
JS实现鼠标箭头变成一个燃烧烛光效果的方法
2015/02/28 Javascript
JS中常用的输出方式(五种)
2016/06/12 Javascript
Bootstrap的基本应用要点浅析
2016/12/19 Javascript
深入理解vue路由的使用
2017/03/24 Javascript
angularjs中ng-bind-html的用法总结
2017/05/23 Javascript
js+html5实现侧滑页面效果
2017/07/15 Javascript
Bootstrap + AngularJS 实现简单的数据过滤字符查找功能
2017/07/27 Javascript
深入浅析javascript继承体系
2017/10/23 Javascript
VeeValidate在vue项目里表单校验应用案例
2018/05/09 Javascript
微信小程序实现的一键拨号功能示例
2019/04/24 Javascript
Python单链表简单实现代码
2016/04/27 Python
Python实现将数据库一键导出为Excel表格的实例
2016/12/30 Python
Python线上环境使用日志的及配置文件
2019/07/28 Python
Python实现语音识别和语音合成功能
2019/09/20 Python
Tensorflow分批量读取数据教程
2020/02/07 Python
HTML5边玩边学(2)基础绘图实现方法
2010/09/21 HTML / CSS
简述你对Statement,PreparedStatement,CallableStatement的理解
2013/03/25 面试题
求职自荐信怎么写
2014/03/06 职场文书
《从现在开始》教学反思
2014/04/15 职场文书
基层工作经验证明样本
2014/11/16 职场文书
2016学习雷锋精神活动倡议书
2015/04/27 职场文书
观看建国大业观后感
2015/06/01 职场文书
解决Navicat for MySQL 连接 MySQL 报2005错误的问题
2021/05/29 MySQL
Python爬虫入门案例之爬取去哪儿旅游景点攻略以及可视化分析
2021/10/16 Python
Python matplotlib绘制条形统计图 处理多个实验多组观测值
2022/04/21 Python