eval与window.eval的差别

eval与window.eval的差别

它们之间有区别吗?

开发过程中似乎很少有人去加个额外的window,觉得多此一举。比如Ajax过程中回调函数解析JSON格式字符串

1 ...
2 function callback(str){
3     var json = eval(‘(‘ + str + ‘)‘);
4 }
5 ...

但由于各个引擎实现差异,它们的区别还是有的。通常直接使用eval,而非var json = window.eval(‘(‘ + str + ‘)‘);
又比如调试时使用alert,很少有人使用window.alert;IE中获取事件对象使用event,很少有人使用window.event。(Firefox中在某些情况下也支持event而不支持window.event。)

 1 var x = 5;
 2
 3 function fn(){
 4
 5     var x = ‘jack‘;
 6
 7     eval(‘x=10;‘);
 8
 9 }
10
11 fn();
12
13 alert(x); // -->5

修改下,把以上代码的eval换成window.eval,测试后发现各个浏览器中的表现不一样了。所有浏览器中输出的都是5,说明调用fn后eval修改的是fn内的局部变量x,而非全局的x。即eval执行的闭包环境是在fn内。

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即使写在自定义函数内使用的也是全局闭包。

时间: 2024-10-25 19:19:07

eval与window.eval的差别的相关文章

this, eval('this'), (0, eval)('this'))

今天又被一段javascript代码神奇到了 function test() { console.log(this, eval('this'), (0, eval)('this')); }; var a = {}; test.apply(a); 在现代浏览器的console里跑上边的代码,结果应该类似是下边这样 Object {} Object {} Window {top: Window, window: Window, location: Location, external: Object

Eval与DataBinder.Eval的区别

DataBinder.Eval的基本格式 DataBinder.Eval(Container.DataItem,"XXX","{0}") <%# DataBinder.Eval(Container.DataItem,"xxxx")%>或者<%# DataBinder.Eval(Container,"DataItem.xxxx")%> 还有一种据说微软说效率很高的方式 <%# ((DataRowVi

一些数据格式化-Eval( &quot; &quot;)和DataBinder.Eval(Container.DataItem, &quot; &quot;)的区别及用法

ASP.NET 2.0改善了模板中的数据绑定操作,把v1.x中的数据绑定语法DataBinder.Eval(Container.DataItem, fieldname)简化为Eval(fieldname).Eval方法与DataBinder.Eval一样可以接受一个可选的格式化字符串参数.缩短的Eval语法与DataBinder.Eval的不同点在于,Eval会根据最近的容器对象(例如DataListItem)的DataItem属性来自动地解析字段,而DataBinder.Eval需要使用参数来

【转载】(0, eval)(‘this’)

var window = this || (0, eval)('this') 在avalon源码中有这么一行代码,var window = this很容易理解 这里复习一下Global Object: Global Object代表一个全局对象,js中不允许存在独立的函数,变量和常量,它们都是Global Object 的属性和方法,包括内置的属性和方法但是Global Object实际并不存在,它是由window充当这个角色,并且这个过程是在js首次加载时进行的 在一个页面中,首次载入js代码

全局作用域 eval

eval是在caller的作用域里运行传给它的代码: var x = 'outer'; (function() { var x = 'inner'; eval('x'); // "inner" })(); 在 ES5,可以分为direct调用或者indirect调用,和是否在strict模式调用 (1,eval)('1+1')  为indirect调用,(1,eval)仍然返回一个eval函数 同样下面这些也是非直接调用: (eval, eval)('...') (1 ? eval :

javascript函数及作用域的小结

在js中使用函数注意三点:1.函数被调用时,它是运行在他被声明时的语法环境中的: 2.函数自己无法运行,它总是被对象调用的,函数运行时,函数体内的this指针指向调用该函数的对象,如果调用函数时没有明确指定该对象, this 默认指向 window ( strict 模式除外,本文不涉及 strict 模式): 3.函数是一种带有可执行代码的对象类型数据. 一.声明函数 1.使用 function 关键字 代码如下: function myfun(a,b){ //声明名为myfun的函数 ret

七天免登陆

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title>    <script type="text/javascript">//        var _str='{"key":"value"}';//  

javascript 函数及作用域总结介绍

在js中使用函数注意三点: 1.函数被调用时,它是运行在他被声明时的语法环境中的: 2.函数自己无法运行,它总是被对象调用的,函数运行时,函数体内的this指针指向调用该函数的对象,如果调用函数时没有明确指定该对象, this 默认指向 window ( strict 模式除外,本文不涉及 strict 模式): 3.函数是一种带有可执行代码的对象类型数据. 一.声明函数 1.使用 function 关键字 代码如下: function myfun(a,b){ //声明名为myfun的函数 re

eval 的使用与延展

前些日子用到了eval()处理json数据,习惯于每次添加'('+json+')'处理数据,也没去深究为什么这么做,刚好同事问我这个问题,瞬间哑口无言,只会如何操作,却讲不出原因,这不符合咱程序员严谨的工作态度,仔细思考了一会,简略的谈谈吧. 可能会随时脑洞,望各位见谅. 1.什么是json? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,是一种取代XML的数据结构,和xml相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量