`

[转] eval 的使用

阅读更多
eval(str)是把传入的str当做脚本来执行,如果直接调用eval(),作用域为当前作用域。

function accumulate() {
  var i = 1;
  eval("var i = 3;");
  document.writeln(i);
}
accumulate();


执行结果:3

如果改成window.eval():

function accumulate() {
  var i = 1;
  window.eval("var i = 3;");
  document.writeln(i);
}
accumulate();


在不同的浏览器上结果不同:

浏览器 IE IE IE Firefox Chrome Chrome Safari Opera
版本 7.0 8.0 9.0 3.5.5 1.0 4.0 4.0.2 9.62
运行结果 3 3 1 3 1 1 1


可见各浏览器及版本对window.eval()的作用域处理是有差异的。

IE中,window.eval()和eval()一样只在当前作用域生效。

Firefox,Safari,Opera中,直接调用eval()为当前作用域,window.eval()调用为全局作用域。

尤其值得注意的是,Google Chrome 的不同版本之间对于eval的处理也有差异。

如果需要全局作用域eval()的效果,就需要进行改进:

1. 使用IE专有的window.execScript()

   window.execScript(sExpression, sLanguage)
   这里的sExpression就是需要执行的脚本字符串,sLanguage是指使用哪种脚本语言:如javascript, vbscript或是其他任何安装过相应解释引擎的脚本如perl,python等。
   非IE内核不支持这个命令

   
// To execute in global environment
function evalGlobal(strScript) {
  if (window.execScript) window.execScript(strScript);
  else window.eval(strScript);
}


看起来,问题似乎圆满解决了。但是显然是有问题的,比如上表中的Chrome 1.0也和IE的eval()规则一致,况且还不知道其他浏览器其他版本是否有差异呢,因此,这种方法并不很可靠。

2. 新建一个<script>元素装载脚本

   
// To execute in global environment
function evalGlobal(strScript) {
  var s = document.createElement("script");
  s.type = "text/javascript";
  s.text = strScript;
  document.getElementsByTagName("head")[0].appendChild(s);
}


这个方法需要新增一个<script>元素,但优点是各种浏览器及版本通用,缺点是毕竟添加了一个HTML元素嘛,影响了页面原本的DOM结构。

3. 使用with

with可以改变上下文环境:

function evalGlobal(strScript) {
  with (window) eval(strScript);
}


特别

有时候,我们eval()要求既不是在全局执行,也不是在当前作用域执行,而是在父对象或子对象中执行,这时,用 with ( objContext )eval (strScript) 就更加是不可替代的选择了。


总结

让eval()全局作用域执行的方法主要有:

(1)window .execScript + window . eval    级别:弱。 缺点:不简洁,不可靠,不通用。

(2)document . createElement ("script" )    级别:凑合。缺点:不简洁,不干净。优点:可靠,通用。

(3)with ( objContext )eval (strScript)          级别:最佳。优点:简洁,干净,可靠,通用。
分享到:
评论

相关推荐

    EVAL操作集合 包含Eval()的一些常用操作 常用函数

    在使用Eval()方法时,可以使用不同的格式化字符串来达到不同的显示效果,例如: * {0:c}:显示货币样式 * {0:d}:显示日期,只显示年月日 * {0:e}:显示科学计数法 * {0:f}:显示固定点数 * {0:g}:显示-general...

    eval 加密和解密

    例如,敏感信息可能被加密存储,当需要使用时,通过解密并用`eval`执行,使得信息可以安全地在程序中使用。 在JavaScript中,`eval`通常用于处理JSON对象,因为JSON.stringify()方法会将JavaScript对象转换成一个...

    在Javascript中Eval函数的使用?

    在大多数情况下,开发者应该避免或谨慎使用`eval()`,转而寻求更安全、更高效的方法来实现相同的功能。对于初学者来说,理解`eval()`的工作原理以及其潜在风险是十分重要的,这样在面对具体场景时才能做出明智的选择...

    java实现eval函数

    在Java中模拟`eval`功能的一个常见方法是通过使用Java Scripting API(JSR 223),它允许你在Java应用程序中嵌入和执行脚本语言,包括JavaScript。以下是一个简单的例子,展示了如何使用JSR 223来执行JavaScript代码...

    js eval函数使用,js对象和字符串互转实例.docx

    ### JavaScript中的`eval()`函数与对象字符串互转详解 #### 一、`eval()`函数概述 在JavaScript中,`eval()`函数是一个强大的工具,它能够将字符串形式的JavaScript代码解析并执行。这使得动态生成和执行代码成为...

    前端项目-expr-eval.zip

    《前端项目-expr-eval:数学表达式求值器的深度解析》 在现代Web开发中,前端项目扮演着至关重要的角色,它们是用户与应用...理解和熟练使用expr-eval,将有助于提升前端开发中的计算功能,让项目更加灵活和智能化。

    test.rar_eval_eval;批量读取TXT文件

    然而,需要注意的是,过度使用或不安全地使用`eval`可能会引入潜在的安全风险,因为它可以执行任意的字符串代码。 批量读取TXT文件通常涉及到文件I/O操作,MATLAB提供了如`fopen`、`fgets`、`fclose`等函数来读取...

    DataBinder.Eval总结

    需要注意的是,使用这种方法之前需要导入`System.Data`命名空间。 ### 二、DataBinder.Eval实现逻辑判断与格式化 DataBinder.Eval不仅可以获取数据,还可以进行简单的逻辑判断和格式化输出。例如: 1. 可以调用...

    在Web控件模板中使用Eval()方法绑定数据

    在Web控件模板中使用`Eval()`方法是实现数据绑定的一种常见方式,它允许我们方便地从数据源中提取并显示特定字段的值。本篇文章将深入探讨`Eval()`方法的工作原理及其在模板中的应用。 `Eval()`方法是ASP.NET内置的...

    j4locr_eval

    3. **j4locr_eval使用**:由于“eval”通常指评估版本,j4locr_eval可能具有一定的功能限制或者过期时间,以便开发者试用并决定是否购买完整版。使用这个库时,开发者需要遵循特定的API,调用方法进行图像读取、...

    GD32450Z-EVAL评估板用户指南_V2.01

    - 对于初次使用GD32450Z-EVAL的开发者,这部分内容至关重要,因为它提供了启动和运行的详细步骤。 4. **硬件设计概述** - 该部分深入介绍了评估板的硬件设计,包括供电电源、启动方式选择、LED指示灯、按键、串口...

    java解析公式 eval.jar

    使用`eval.jar`库,开发者可以轻松地在Java程序中构建动态计算功能,无需编写复杂的解析代码。这在数据分析、科学计算、游戏逻辑或者任何需要根据用户输入计算结果的场景中都非常有用。以下是一些关键知识点: 1. *...

    768eval科学计算器

    在使用768eval科学计算器时,用户需要注意合理选择运算模式,如普通模式、科学模式或程序员模式,以适应不同的计算场景。同时,善用内存功能,可以存储和调用中间结果,提高计算效率。对于复杂的公式或表达式,可以...

    GD32450i-EVAL开发板原理图

    根据提供的信息,GD32450i-EVAL开发板原理图包含多种接口的参考...在设计和使用开发板时,需要参考完整的原理图和数据手册,以确保正确实现各部分的功能,并解决可能存在的电气干扰、信号完整性和电源稳定性等问题。

    STM3210C_EVAL_stm32_STM3210C_EVAL_temperature565_

    描述中提到的"STM3210C EVAL 的 LL 和 HAL 例程",是指STM3210C EVAL板上使用的底层库(Low-Level Library, LL)和硬件抽象层(Hardware Abstraction Layer, HAL)。LL库是直接针对STM32内核和外设寄存器的操作,...

    STM3210E-EVAL原理图

    STM3210E-EVAL是一款基于STM32微控制器的评估板,它为开发者提供了在实际项目中测试和开发STM3210B系列芯片的功能。STM32是意法半导体(STMicroelectronics)推出的基于ARM Cortex-M内核的微控制器系列,以其高性能...

    js eval函数使用,js对象和字符串互转实例

    当从不可信的源接收字符串时,使用`eval()`可能会导致代码注入攻击,因此应当谨慎使用。在大多数情况下,寻找更安全的替代方法(如使用函数参数或模板字符串)更为推荐。 接下来,我们讨论JavaScript中的对象与字符...

    巧用eval解析json对象

    本篇将聚焦于如何巧妙地使用`eval`函数来解析JSON对象,虽然在实际开发中,由于安全考虑我们通常会避免使用`eval`,但理解其工作原理对于学习JavaScript和JSON解析至关重要。 首先,JSON对象本质上是符合JSON语法的...

Global site tag (gtag.js) - Google Analytics