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 全角转换实现代码
Jul 17 Javascript
轻量级 JS ToolTip提示效果
Jul 20 Javascript
Prototype源码浅析 Enumerable部分(二)
Jan 18 Javascript
javascript学习笔记(八)正则表达式
Oct 08 Javascript
极易被忽视的javascript面试题七问七答
Feb 15 Javascript
基于JavaScript实现的快速排序算法分析
Apr 14 Javascript
vue路由跳转传参数的方法
May 06 Javascript
vue项目中常见问题及解决方案(推荐)
Oct 21 Javascript
微信小程序转发事件实现解析
Oct 22 Javascript
详解element-ui动态限定的日期范围选择器代码片段
Jul 03 Javascript
JavaScript JSON使用原理及注意事项
Jul 30 Javascript
vue flex 布局实现div均分自动换行的示例代码
Aug 05 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字符串的递增和递减示例介绍
2014/02/11 PHP
分享一段php获取linux服务器状态的代码
2014/05/27 PHP
php 人员权限管理(RBAC)实例(推荐)
2017/05/24 PHP
图片自动缩小的js代码,用以防止图片撑破页面
2007/03/12 Javascript
jquery获取radio值(单选组radio)
2014/10/16 Javascript
浅谈JavaScript 框架分类
2014/11/10 Javascript
javascript递归回溯法解八皇后问题
2015/04/22 Javascript
JS图片压缩(pc端和移动端都适用)
2017/01/12 Javascript
Javascript 使用ajax与C#获取文件大小实例详解
2017/01/13 Javascript
移动端网页开发调试神器Eruda的介绍与使用技巧
2017/10/30 Javascript
Angular4.0中引入laydate.js日期插件的方法教程
2017/12/25 Javascript
JS 实现缓存算法的示例(FIFO/LRU)
2018/03/20 Javascript
图片文字识别(OCR)插件Ocrad.js教程
2018/11/26 Javascript
详解关于表格合并span-method方法的补充(表格数据由后台动态返回)
2019/05/21 Javascript
jquery传参及获取方式(两种方式)
2020/02/13 jQuery
vue中父子组件的参数传递和应用示例
2021/01/04 Vue.js
Python找出文件中使用率最高的汉字实例详解
2015/06/03 Python
Python实现简单的代理服务器
2015/07/25 Python
Python模拟鼠标点击实现方法(将通过实例自动化模拟在360浏览器中自动搜索python)
2017/08/23 Python
matplotlib.pyplot绘图显示控制方法
2019/01/15 Python
用uWSGI和Nginx部署Flask项目的方法示例
2019/05/05 Python
pytorch打印网络结构的实例
2019/08/19 Python
浅谈Python xlwings 读取Excel文件的正确姿势
2021/02/26 Python
什么是符号链接,什么是硬链接?符号链接与硬链接的区别是什么?
2013/05/03 面试题
某/etc/fstab文件中的某行如下: /dev/had5 /mnt/dosdata msdos defaults,usrquota 1 2 请解释其含义
2013/04/11 面试题
20年同学聚会邀请函
2014/02/04 职场文书
化妆品店促销方案
2014/02/24 职场文书
党组织公开承诺书
2014/03/29 职场文书
汽修专业自荐信
2014/07/07 职场文书
2014年酒店工作总结范文
2014/11/17 职场文书
社区服务活动感想
2015/08/11 职场文书
学校教师培训工作总结
2015/10/14 职场文书
《秋天的图画》教学反思
2016/02/19 职场文书
导游词之鲁迅祖居
2019/10/17 职场文书
前端canvas中物体边框和控制点的实现示例
2022/08/05 Javascript
MySQL使用IF语句及用case语句对条件并结果进行判断 
2022/09/23 MySQL