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类库的顶层对象名用户体验分析
Oct 24 Javascript
jquery中animate动画积累的解决方法
Oct 05 Javascript
在firefox和Chrome下关闭浏览器窗口无效的解决方法
Jan 16 Javascript
javascript得到当前页的来路即前一页地址的方法
Feb 18 Javascript
Javascript小技能总结(推荐)
Jun 02 Javascript
Bootstrap Table使用整理(一)
Jun 09 Javascript
详解js创建对象的几种方法及继承
Apr 12 Javascript
vue+elementUI组件table实现前端分页功能
Nov 15 Javascript
JS Thunk 函数的含义和用法实例总结
Apr 08 Javascript
微信小程序通过websocket实时语音识别的实现代码
Aug 19 Javascript
前端学习——JavaScript原生实现购物车案例
Mar 31 Javascript
vue如何实现关闭对话框后刷新列表
Apr 08 Vue.js
整理一些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函数(简单整理)
2010/04/30 PHP
PHP实现将MySQL重复ID二维数组重组为三维数组的方法
2016/08/01 PHP
PHP使用preg_split()分割特殊字符(元字符等)的方法分析
2017/02/04 PHP
Javascript Throttle & Debounce应用介绍
2013/03/19 Javascript
js 去除字符串第一位逗号的方法
2014/06/07 Javascript
JS实现至少包含字母、大小写数字、字符的密码等级的两种方法
2015/02/03 Javascript
js+css实现的圆角边框TAB选项卡滑动门代码分享(2款)
2015/08/26 Javascript
JavaScript中setTimeout和setInterval函数的传参及调用
2016/03/11 Javascript
js获取元素的外链样式的简单实现方法
2016/06/06 Javascript
Node.js如何自动审核团队的代码
2016/07/20 Javascript
js获取腾讯视频ID的方法
2016/10/03 Javascript
JS动态给对象添加属性和值的实现方法
2016/10/21 Javascript
浅析如何利用JavaScript进行语音识别
2016/10/27 Javascript
js复制内容到剪贴板代码,js复制代码的简单实例
2016/10/27 Javascript
localStorage实现便签小程序
2016/11/28 Javascript
清除浏览器缓存的几种方法总结(必看)
2016/12/09 Javascript
Vue组件之全局组件与局部组件的使用详解
2017/10/09 Javascript
使用Angular CLI快速创建Angular项目的一些基本概念和写法小结
2018/04/22 Javascript
JS中appendChild追加子节点无效的解决方法
2018/10/14 Javascript
如何优雅地取消 JavaScript 异步任务
2020/03/22 Javascript
实现vuex原理的示例
2020/10/21 Javascript
Python编程修改MP3文件名称的方法
2017/04/19 Python
Php多进程实现代码
2018/05/07 Python
浅谈Django的缓存机制
2018/08/23 Python
Python弹出输入框并获取输入值的实例
2019/06/18 Python
PYQT5开启多个线程和窗口,多线程与多窗口的交互实例
2019/12/13 Python
Pycharm激活码激活两种快速方式(附最新激活码和插件)
2020/03/12 Python
Python爬取网页信息的示例
2020/09/24 Python
python代码实现图书管理系统
2020/11/30 Python
阻止移动设备(手机、pad)浏览器双击放大网页的方法
2014/06/03 HTML / CSS
交通专业个人自荐信格式
2013/09/23 职场文书
人事助理岗位职责
2013/11/18 职场文书
结婚老公保证书
2015/02/26 职场文书
社会实践活动总结格式
2015/05/11 职场文书
寻衅滋事罪辩护词
2015/05/21 职场文书
利用Python脚本写端口扫描器socket,python-nmap
2022/07/23 Python