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操作cookie_获取与修改代码
May 21 Javascript
JS实现下拉框的动态添加(附效果)
Apr 03 Javascript
网页收藏夹显示ICO图标(代码少)
Aug 04 Javascript
JS判断当前页面是否在微信浏览器打开的方法
Dec 08 Javascript
在js中实现邮箱格式的验证方法(推荐)
Oct 24 Javascript
详解Angualr 组件间通信
Jan 21 Javascript
JS实现的随机排序功能算法示例
Jun 09 Javascript
javascript设计模式 ? 建造者模式原理与应用实例分析
Apr 10 Javascript
vue-router 控制路由权限的实现
Sep 24 Javascript
angular8.5集成TinyMce5的使用和详细配置(推荐)
Nov 16 Javascript
在Vue中使用Echarts可视化库的完整步骤记录
Nov 18 Vue.js
node中短信api实现验证码登录的示例代码
Jan 20 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
用ODBC的分页显示
2006/10/09 PHP
PHP以mysqli方式连接类完整代码实例
2014/07/15 PHP
PHP使用ffmpeg给视频增加字幕显示的方法
2015/03/12 PHP
PHP文件生成的图片无法使用CDN缓存的解决方法
2015/06/20 PHP
php解决约瑟夫环算法实例分析
2019/09/30 PHP
javascript面向对象之二 命名空间
2011/02/08 Javascript
基于jQuery的可用于选项卡及幻灯的切换插件
2011/03/28 Javascript
用js判断页面是否加载完成实现代码
2012/12/11 Javascript
用表格输出1-1000之间的数字实现代码(附特效)
2013/04/21 Javascript
input禁止键盘及中文输入,但可以点击
2014/02/13 Javascript
JavaScript分秒倒计时器实现方法
2015/02/02 Javascript
javascript中Array数组的迭代方法实例分析
2015/02/04 Javascript
解决JavaScript数字精度丢失问题的方法
2015/12/03 Javascript
node.js 抓取代理ip实例代码
2017/04/30 Javascript
Angular 4.x+Ionic3踩坑之Ionic3.x pop反向传值详解
2018/03/13 Javascript
JavaScript实现身份证验证代码实例
2019/08/26 Javascript
jQuery实现验证用户登录
2019/12/10 jQuery
python 查找字符串是否存在实例详解
2017/01/20 Python
Python迭代器和生成器定义与用法示例
2018/02/10 Python
Python可视化mhd格式和raw格式的医学图像并保存的方法
2019/01/24 Python
Python列表(List)知识点总结
2019/02/18 Python
一步步教你用python的scrapy编写一个爬虫
2019/04/17 Python
谈一谈数组拼接tf.concat()和np.concatenate()的区别
2020/02/07 Python
python操作redis数据库的三种方法
2020/09/10 Python
Free People中国官网:波西米亚风格女装服饰
2016/08/30 全球购物
ALDO加拿大官网:加拿大女鞋品牌
2018/12/22 全球购物
高中历史教学反思
2014/02/08 职场文书
团支部建设方案
2014/05/02 职场文书
主题团日活动总结
2014/06/25 职场文书
2014年教务工作总结
2014/12/03 职场文书
父亲节活动总结
2015/02/12 职场文书
公司管理建议书
2015/09/14 职场文书
2015年四年级班主任工作总结
2015/10/22 职场文书
Nginx本地目录映射实现代码实例
2021/03/31 Servers
Golang 实现获取当前函数名称和文件行号等操作
2021/05/08 Golang
Python 可迭代对象 iterable的具体使用
2021/08/07 Python