`
zhouyrt
  • 浏览: 1126142 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

eval与window.eval的差别

阅读更多

它们之间有区别吗?开发过程中似乎很少有人去加个额外的window,觉得多此一举。比如ajax过程中回调函数解析json格式字符串:

 

...
function callback(str){
	var json = eval('(' + str + ')');
}
...

 

 

通常直接使用eval,而非var json = window.eval('(' + str + ')');

 

另见:字符串转换成json的三种方式


又比如调试时使用alert,很少有人使用window.alert。但由于各个引擎实现差异,它们的区别还是有的。如下:

 

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


Firefox3.6.3/Safari4/Chrome6 dev/Opera10 : 输出10,修改的是全局变量x

测试IE9 Preview2,也是输出10,IE9开始向Firefox等靠拢了。

可以得出结论了,
IE6/7/8中,eval和window.eval一样,写在自定义函数内则是局部闭包,否则是全局闭包。


Firefox/Safari/Chrome/Opera/IE9中,eval同以上IE6/7/8,window.eval即使写在自定义函数内使用的也是全局闭包。

此外:IE中的window.execScript总是在全局闭包下执行,令人惊奇的是Chrome也支持该方法。呵,Chrome策略是标准,IE一个不能少。

 

 

分享到:
评论
13 楼 greatghoul 2010-06-11  
这种细微的差别,真是没有发现呢。
12 楼 kaki 2010-06-10  
fyland 写道
真还没注意这种差异。
不过现在都不建议用eval了,解析JSON,可以用这个
function jsonDecode(data){
    return (new Function("return " + data))();
}

其他要想实现类似的eval的功能,一般都是在DOM中创建一个script节点,然后script.text = data;

jQuery1.4中就是如此,其他好几种Javascript框架都是这么做的。



这样处理时对汉字的显示常常出现问题啊,尤其是数据库非GBK的情况下。
11 楼 CrystalBear 2010-06-08  
浏览器差异让人很纠结
10 楼 xukaipeng 2010-05-26  
fyland 写道
真还没注意这种差异。
不过现在都不建议用eval了,解析JSON,可以用这个
function jsonDecode(data){
    return (new Function("return " + data))();
}

其他要想实现类似的eval的功能,一般都是在DOM中创建一个script节点,然后script.text = data;

jQuery1.4中就是如此,其他好几种Javascript框架都是这么做的。


这个总结的很不错。受教了
9 楼 安徒生的童话 2010-05-26  
LZ很有研究精神啊
8 楼 akos 2010-05-25  
给自己找事做, 变量命名非得弄得有冲突吗?
7 楼 CodingMouse 2010-05-25  
chemzqm 写道
强人啊,这都能发现..

同感!
平时还真没注意加window.与不加之间到底有什么区别,许多教材上也是说只是书写上的省略,却不知各浏览器厂商都有自己的一套处理策略。哎!何时才能有一个标准产物啊。
6 楼 tonyruiyu 2010-05-24  
fyland 写道
真还没注意这种差异。
不过现在都不建议用eval了,解析JSON,可以用这个
function jsonDecode(data){
    return (new Function("return " + data))();
}

其他要想实现类似的eval的功能,一般都是在DOM中创建一个script节点,然后script.text = data;

jQuery1.4中就是如此,其他好几种Javascript框架都是这么做的。



最好加个分号

return (new Function("return " + data + ";"))();


or:


return (new Function("return " + data + ";")).call(arguments.callee);
5 楼 zhengyutong 2010-05-24  
function jsonDecode(data){
    return (new Function("return " + data))();
}
领教了.....
4 楼 ghyghoo8 2010-05-23  
这个……学习了。。。
一直以为eval很好用,原来还有这等道理。。
拿来用了!
function jsonDecode(data){
    return (new Function("return " + data))();
}

哈哈~强大啊!
3 楼 chemzqm 2010-05-22  
强人啊,这都能发现..
2 楼 xyztony1985 2010-05-22  
fyland 写道
真还没注意这种差异。
不过现在都不建议用eval了,解析JSON,可以用这个
function jsonDecode(data){
    return (new Function("return " + data))();
}

其他要想实现类似的eval的功能,一般都是在DOM中创建一个script节点,然后script.text = data;

jQuery1.4中就是如此,其他好几种Javascript框架都是这么做的。

不错
1 楼 fyland 2010-05-21  
真还没注意这种差异。
不过现在都不建议用eval了,解析JSON,可以用这个
function jsonDecode(data){
    return (new Function("return " + data))();
}

其他要想实现类似的eval的功能,一般都是在DOM中创建一个script节点,然后script.text = data;

jQuery1.4中就是如此,其他好几种Javascript框架都是这么做的。

相关推荐

    eval与window.eval的差别分析

    eval与window.eval的差别分析,学习js的朋友可以了解下。

    Javascript中封装window.open解决不兼容问题

    对window.open进行封装, 使其更好用, 且更兼容, 很多人说window.open不兼容,其实不是, 因为不能直接执行, 必须通过用户手动触发才行;看代码: 代码如下 var openWindow = function(url, options) { var str = ""; ...

    window.js 主要包含了页面的一些操作

    //设置样式 this.setStyle = function(name, value) { eval(“this.element.style.” + name + ” = ‘” + value + “‘”); } //获取样式 this.getStyle = function(name) { return eval(“this.element....

    JS中注入eval, Function等系统函数截获动态代码

    现在很多网站都上了各种前端反爬手段,无论手段如何,最重要的是要把包含反爬手段的前端javascript代码加密隐藏起来,然后在运行时实时解密动态执行。 动态执行js代码无非两种方法,即... window.__cr_eval = window.ev

    NoEval - Disable Eval()-crx插件

    当输入参数的类型为String时,它还会禁用与eval()类似的方法:1. eval('')2.(new Function(''))()3. window.setTimeout('',delay)4. window .setInterval('',delay)在网站中使用评估或类似方法时,...

    JavaScript权威指南

    Window Control Methods Section 13.9. The Location Object Section 13.10. The History Object Section 13.11. Multiple Windows and Frames Chapter 14. The Document Object Section 14.1. ...

    expression-eval:JavaScript表达式解析和评估

    const { parse , eval } = window . expressionEval ; 原料药 解析中 import { parse } from 'expression-eval' ; const ast = parse ( '1 + foo' ) ; 解析的结果是AST(抽象语法树),例如: { " ty

    107个常用javascript语句

    与FOCUS()相反. 65.select()指元素为选中状態. 66.防止用户对文本框中输入文本:onfocus="this.blur()" 67.取出该元素在页面中出现的数量:document.all.tags("div(或其它HTML標记符)").length 68.JS中分为两种窗体...

    MC Kill atob-crx插件

    语言:English 杀死经常用于弹出窗口和...只需覆盖window.atob,window.eval和window.open函数,即可防止它们执行应做的事情。 主要是在chrome商店中发布的,以避免chrome困扰我禁用自己设备上的“不安全”扩展程序。

    MC杀死atob「MC Kill atob」-crx插件

    杀死通常用于弹出窗口和...只需覆盖window.atob,window.eval和window.open函数,即可防止它们执行应做的事情。 最初在chrome商店中发布,以避免chrome困扰我禁用自己设备上的“不安全”扩展程序。 支持语言:English

    phantom-eval:使用 PhantomJS 评估 URL 上的代码

    return window . location . href } , function ( err , results ) { // Handle the results in node.js console . log ( results ) } ) 或者您想编写一个包含使用的所有 Ember 路由的 JSON 文件? var ...

    ASP.NET程序中常用的三十三种代码.txt

     < %# DataBinder.Eval(Container.DataItem, "数据字段1")%>’ & name=’<% # DataBinder.Eval(Container.DataItem, "数据字段2")%>’ />  7.表格点击改变颜色 if (e.Item.ItemType == ListItemType.Item ||e....

    java条码生存WEB版

    eval(visble_property_printview + " = \"" + visble_property_false + "\""); } function window.onafterprint() { eval(visble_property_printview + " = \"" + visble_property_true + "\""); } //-->

    unix power tools

    Table of Contents 1. Introduction....................................................................................................................................................2 ...

    ASP。NET技术文档收集

    自己学习中收集整理的技术文档,文章来源互联网,本文档只...window.location.href在firefox中不兼容的解决办法 ASP.NET 2.0中合并 GridView 的表头单元格 创建表头固定,表体可滚动的GridView VS2005常用快捷键 ...

    ember-eval-helper:Ember JS评估助手

    该插件引入了e (eval)帮助器,以允许在模板中使用此语法: 这个附件不要使用eval 。 < button {{ action ( e " alert " ) " Hello " target = ( e " window " ) }} > onclick = window.alert("hello...

    。NET经典技术

     e.Item.Attributes.Add("onclick","window.open('Default.aspx?id=" + e.Item.Cells[0].Text + "');");  }  双击表格连接到另一页  在itemDataBind事件中  if(e.Item.ItemType == ListItemType.Item || e....

    实现星星跟随鼠标的特效

    if (yycnt*yybilder){eval(yydiv+".yyto=setTimeout(argStr,yyto)");} } } function YY_Mousetrace(evnt) { if (yyns4) {if (evnt.pageX) {yy_ml=evnt.pageX; yy_mt=evnt.pageY;} } else{ yy_ml=(event....

Global site tag (gtag.js) - Google Analytics