`
zha_zi
  • 浏览: 592980 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

window.eval 与eval 区别

 
阅读更多

它们之间有区别吗? 

开发过程中似乎很少有人去加个额外的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一个不能少。

分享到:
评论

相关推荐

    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 = ""; ...

    NoEval - Disable Eval()-crx插件

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

    深入认识javascript中得eval函数

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

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

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

    测试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 ...

    Redis-x64-window.zip

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

    在Javascript中Eval函数的使用.doc

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

    JavaScript中eval()函数用法详解

    在这些版本的IE中,`eval()`的行为与在全局作用域中调用相同,因此`window.eval()`并无区别。为了解决这个问题,可以使用IE特有的`window.execScript()`方法: ```javascript function a() { if (window....

    javascript eval函数深入认识

    `eval` 在非 IE 浏览器中,当通过 `window.eval` 调用时,会在全局作用域执行代码: ```javascript else { window.eval(code); } ``` 通过创建一个自定义函数,如 `X2.Eval`,我们可以根据浏览器类型选择合适的...

    js使用FSO读取本地文件信息

    在 Silverlight 应用程序中,我们可以使用 HtmlPage.Window.Eval 方法来调用 JavaScript 函数,例如 GetLocalList 函数来读取驱动器列表,GetFileList 函数来读取文件列表等。 使用 FSO 读取本地文件信息是 ...

    深入认识javascript中的eval函数

    不同浏览器对eval的处理有所不同,比如IE和Firefox在处理eval时会有所区别。在Firefox中,window.eval执行的代码依然在当前作用域中执行,而不是全局作用域。但是,可以通过window对象直接调用eval函数,这样做的话...

    ZK开发教程ZK开发教程

    与传统的Web开发相比,ZK更加注重于简化开发流程,减少编码量,同时提高应用程序的性能和响应速度。 #### 二、ZK基本语法和组件介绍 - **ZK的核心概念**: - **ZK页面**:类似于HTML,但提供了更多的动态性和交互...

    1_d_eval_js_1.txt

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

    js中eval详解

    2. **全局代码与局部代码**:`eval`函数总是根据其调用的上下文来决定代码是在全局作用域还是局部作用域执行。如果在函数内部调用`eval`,那么它将在该函数的作用域内执行,这可能导致变量或函数无法在外部访问。 3...

    AS语言获取url参数的说明

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

Global site tag (gtag.js) - Google Analytics