`
zhouyrt
  • 浏览: 1162113 次
  • 性别: 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的差别分析

    而在IE6/7/8中,`window.eval`的行为与`eval`相同,即在函数内部调用时,它仍保持在局部作用域。 此外,IE浏览器还有一个名为`window.execScript`的函数,它始终在全局作用域中执行代码,不论其调用位置。值得注意...

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

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

    在Javascript中Eval函数的使用.doc

    `eval(window[userAction])`将尝试执行`window.swapImage`,如果它是一个函数的话。 然而,`eval()`的主要问题是安全性。因为`eval()`能够执行任意的JavaScript代码,如果用户能够控制传入`eval()`的字符串,那么就...

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

    在JavaScript中,`window.js`通常是一个用于处理与浏览器窗口或页面交互的脚本文件。这个文件中的功能主要集中在获取和操作页面上的元素,以及处理与这些元素相关的样式和事件。以下是对`window.js`中部分代码的详细...

    Redis-x64-window.zip

    2. **启动与停止Redis**: - 启动Redis服务:使用`redis-server.exe --service-start`命令。 - 停止Redis服务:使用`redis-server.exe --service-stop`命令。 3. **配置Redis**: - Redis的主要配置文件是`redis...

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

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

    测试eval方法所以造成无法通过google closure compiler编译

    2. 使用`window.eval()`:在某些情况下,如果必须使用`eval()`,可以将它限制在全局作用域,通过`window.eval()`调用,这样Closure Compiler可以识别这是一个全局操作。 3. 使用`@nocache`注释:在`eval()`前添加`/...

    自动关闭ie的弹出窗口

    可以使用`Document.Window.Eval()`来执行JavaScript代码,关闭弹出窗口: ```csharp private void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { foreach (HtmlElement ...

    JSON在Javascript中的使用(eval和JSON.parse的区别)详细解析

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它...此外,`JSON.stringify()`方法是将JavaScript对象转化为JSON字符串的对应操作,与`JSON.parse()`一起,它们构成了JSON在JavaScript中的基本操作。

    1_d_eval_js_1.txt

    根据提供的文件信息,我们可以分析出该文件主要涉及的是HTML与JavaScript相关的知识点,特别是与`<iframe>`元素以及JavaScript中的`eval()`函数的应用有关。接下来,我们将深入探讨这些知识点。 ### ...

    深入认识javascript中得eval函数

    这里需要注意的是,虽然`X2.Eval`内部也使用了`eval`,但由于它是通过`window.eval`调用的,所以它仍然会在当前作用域内执行。 #### 六、总结 尽管`eval`函数提供了强大的功能,但鉴于其可能带来的安全性和性能...

    NoEval - Disable Eval()-crx插件

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

    AS语言获取url参数的说明

    这里的代码利用了`ExternalInterface.call`方法调用了JavaScript中的`eval`函数来执行`window.location.href`,从而获取到了完整的URL。 ##### 2. 获取协议 协议可以通过`window.location.protocol`来获取。例如:...

    屏幕从中间拉开JS特效之.pdf

    temp2[1].left = (window.innerWidth - temp2[1].width) / 2; temp2[1].top = (window.innerHeight - temp2[1].height) / 2; function openit() { if (document.layers) { temp[1].left -= speed; temp2[1]....

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

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

    javascript中eval和with用法实例总结.docx

    ### JavaScript中的`eval`与`with`用法详解 #### 一、`eval`函数 ##### 1. 定义 `eval`是JavaScript中一个非常强大的内置函数,它可以将字符串解析并执行为JavaScript代码。这使得开发者能够在运行时动态地创建和...

Global site tag (gtag.js) - Google Analytics