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()方法时,可以使用不同的格式化字符串来达到不同的显示效果,例如: * {0:c}:显示货币样式 * {0:d}:显示日期,只显示年月日 * {0:e}:显示科学计数法 * {0:f}:显示固定点数 * {0:g}:显示-general...
例如,敏感信息可能被加密存储,当需要使用时,通过解密并用`eval`执行,使得信息可以安全地在程序中使用。 在JavaScript中,`eval`通常用于处理JSON对象,因为JSON.stringify()方法会将JavaScript对象转换成一个...
在大多数情况下,开发者应该避免或谨慎使用`eval()`,转而寻求更安全、更高效的方法来实现相同的功能。对于初学者来说,理解`eval()`的工作原理以及其潜在风险是十分重要的,这样在面对具体场景时才能做出明智的选择...
在Java中模拟`eval`功能的一个常见方法是通过使用Java Scripting API(JSR 223),它允许你在Java应用程序中嵌入和执行脚本语言,包括JavaScript。以下是一个简单的例子,展示了如何使用JSR 223来执行JavaScript代码...
### JavaScript中的`eval()`函数与对象字符串互转详解 #### 一、`eval()`函数概述 在JavaScript中,`eval()`函数是一个强大的工具,它能够将字符串形式的JavaScript代码解析并执行。这使得动态生成和执行代码成为...
《前端项目-expr-eval:数学表达式求值器的深度解析》 在现代Web开发中,前端项目扮演着至关重要的角色,它们是用户与应用...理解和熟练使用expr-eval,将有助于提升前端开发中的计算功能,让项目更加灵活和智能化。
然而,需要注意的是,过度使用或不安全地使用`eval`可能会引入潜在的安全风险,因为它可以执行任意的字符串代码。 批量读取TXT文件通常涉及到文件I/O操作,MATLAB提供了如`fopen`、`fgets`、`fclose`等函数来读取...
需要注意的是,使用这种方法之前需要导入`System.Data`命名空间。 ### 二、DataBinder.Eval实现逻辑判断与格式化 DataBinder.Eval不仅可以获取数据,还可以进行简单的逻辑判断和格式化输出。例如: 1. 可以调用...
在Web控件模板中使用`Eval()`方法是实现数据绑定的一种常见方式,它允许我们方便地从数据源中提取并显示特定字段的值。本篇文章将深入探讨`Eval()`方法的工作原理及其在模板中的应用。 `Eval()`方法是ASP.NET内置的...
3. **j4locr_eval使用**:由于“eval”通常指评估版本,j4locr_eval可能具有一定的功能限制或者过期时间,以便开发者试用并决定是否购买完整版。使用这个库时,开发者需要遵循特定的API,调用方法进行图像读取、...
- 对于初次使用GD32450Z-EVAL的开发者,这部分内容至关重要,因为它提供了启动和运行的详细步骤。 4. **硬件设计概述** - 该部分深入介绍了评估板的硬件设计,包括供电电源、启动方式选择、LED指示灯、按键、串口...
在使用768eval科学计算器时,用户需要注意合理选择运算模式,如普通模式、科学模式或程序员模式,以适应不同的计算场景。同时,善用内存功能,可以存储和调用中间结果,提高计算效率。对于复杂的公式或表达式,可以...
根据提供的信息,GD32450i-EVAL开发板原理图包含多种接口的参考...在设计和使用开发板时,需要参考完整的原理图和数据手册,以确保正确实现各部分的功能,并解决可能存在的电气干扰、信号完整性和电源稳定性等问题。
描述中提到的"STM3210C EVAL 的 LL 和 HAL 例程",是指STM3210C EVAL板上使用的底层库(Low-Level Library, LL)和硬件抽象层(Hardware Abstraction Layer, HAL)。LL库是直接针对STM32内核和外设寄存器的操作,...
使用`eval.jar`库,开发者可以轻松地在Java程序中构建动态计算功能,无需编写复杂的解析代码。这在数据分析、科学计算、游戏逻辑或者任何需要根据用户输入计算结果的场景中都非常有用。以下是一些关键知识点: 1. *...
STM3210E-EVAL是一款基于STM32微控制器的评估板,它为开发者提供了在实际项目中测试和开发STM3210B系列芯片的功能。STM32是意法半导体(STMicroelectronics)推出的基于ARM Cortex-M内核的微控制器系列,以其高性能...
当从不可信的源接收字符串时,使用`eval()`可能会导致代码注入攻击,因此应当谨慎使用。在大多数情况下,寻找更安全的替代方法(如使用函数参数或模板字符串)更为推荐。 接下来,我们讨论JavaScript中的对象与字符...
本篇将聚焦于如何巧妙地使用`eval`函数来解析JSON对象,虽然在实际开发中,由于安全考虑我们通常会避免使用`eval`,但理解其工作原理对于学习JavaScript和JSON解析至关重要。 首先,JSON对象本质上是符合JSON语法的...