`
反求诸己
  • 浏览: 543090 次
  • 性别: Icon_minigender_1
  • 来自: 湖南娄底
社区版块
存档分类
最新评论

js 中eval和execScript

 
阅读更多

http://blog.csdn.net/on_load_1988/article/details/5342823

eval的作用其实很简单,就是把一段字符串传递给JS解释器,由Javascript解释器将这段字符串解释成Javascript代码,并且执行他。
举个最简单的例子: 
代码如下:
<script type="text/javascript">
eval("alert(1+1)");
</script>

很简单,把字符串解释成JS代码并执行,弹出2。
当然,上面的 例子只是个玩具,在实际中没有人会傻到这么用。我想大家最基本的使用eval函数都是应该在DOM中,例如我们有div1,div2,div3,那么在 document.getElementByID时我们的ID没有办法去得到,那么最简单的办法就是在for循环中,使用eval来拼接这么一段程序。例 如这样:
代码如下:
<script type="text/javascript">
for (var loop = 1; loop < 10; loop++) {
eval('document.getElementById("div"+loop).innerHTML="123"');
}
</script>

最基本的用法说完,相信大家还是对这个函数意犹未尽,如果这个函数只有这么点用法,那就太无聊了。那我们就一点点来剖下一下eval()函数。
我们就先从eval的作用域说起,先看这样一段函数: 
代码如下:
<script type="text/javascript">
eval("var i=3");
alert(i);
</script>

代码很简单,结果可以弹出3。接下来再对比这段代码:
代码如下:
<script type="text/javascript">
var test = function () {
eval("var i=3");
alert(i);
}
test();
alert(i);
</script>

结果是首先弹出3,然后是undefined。
那么说明:eval()函数动态执行的代码并不会创建新的作用域,其代码就是在当前的作用域执行的。因此也就是说,eval()函数也完全可以使用当前作用域的this,argument等对象。
在IE中,支持这样一种和eval()非常类似的函数叫做:execScript()。我们可以来写段简单的代码。
代码如下:
<script type="text/javascript">
var test = function () {
execScript("var i=3");
alert(i);
}
test();
alert(i);
</script>

结果弹出了2个3,这也就看出了execScript函数的特点,首先他 和eval相类似,都能将字符串解释成JS代码并且执行,但是他的作用域不是当前作用域,而是全局作用域。当我们把上面的代码放到Firefox和谷歌浏 览器上去试试:发现在Firefox上execScript上代码是无效的,那么也说明一个问题,execScript代码的浏览器兼容性是有问题的。
那么就引申出这样一个问题,我们如何能把这两个函数的“优点”给汇总到一起呢,也就是说,全局+浏览器兼容性。上网搜了下,自己给汇总了一下,大概是这样:
代码如下:
<script type="text/javascript">
var StrongEval = function (code) {
if (window.navigator.userAgent.indexOf("MSIE") >= 1) {
execScript(code);
}
if (window.navigator.userAgent.indexOf("Firefox") >= 1) {
window.eval(code);
}
else {
execScript(code);
}
};
var Test = function () {
StrongEval("var i=3");
}
Test();
alert(i);
</script>

这样就可以完美地兼容FF和IE了,其本质代码就在于在FF中eval和window.eval并不等效,这是个很奇妙的事。
另外,我们还可以用eval+with实现一些奇淫技巧。
我们在一般意义上可以写出这样的代码: 
代码如下:
var obj = function () {
this.a = 1;
this.b = 2;
this.c = 5;
this.fun = function () {
this.c = this.a + this.b;
}
};
var o = new obj();
o.fun();
alert(o.c);

或者是这样:
代码如下:
var obj = {
a: 1,
b: 2,
c: 5,
fun: function () {
this.c = this.a + this.b;
}
}

再或者是这样:
代码如下:
var obj = function () {
this.a = 1;
this.b = 2;
this.c = 5;
};
obj.prototype.fun = function () {
this.c = this.a + this.b;
}
var o = new obj();
o.fun();
alert(o.c);

无论怎么样,你是不是对这样的this感觉厌烦了呢?那就让我们采取个很另类的办法吧,让至少在感官上可能会舒服一点。
代码如下:
<script type="text/javascript">
var funtemp = function () {
c = a + b;
}
var obj = {
a: 1,
b: 2,
c: 5
};
var fun;
with (obj) {
eval("fun = " + funtemp);
}
fun();
alert(obj.c);
</script>

这个很勉强,那么好,我们不讨论什么看着舒服不舒服。我们来讨论这样一种情况。
代码如下:
<script>
var DBCommon = function () {
alert("1."); CreateConnection();
alert("2."); OpenConnection();
alert("3."); CreateCommand();
alert("4."); ExcuteCommand();
alert("5."); CloseConnection();
}
var SQLServerCommon = {
CreateConnection: function () { alert("建立SQL Server连接"); },
OpenConnection: function () { alert("打开SQL Server连接"); },
CreateCommand: function () { alert("创建¨SQL Server命令"); },
ExcuteCommand: function () { alert("执行DSQL Server命令"); },
CloseConnection: function () { alert("关闭SQL Server连接"); }
};
var OracleCommon = {
CreateConnection: function () { alert("建立¢Oracle连接"); },
OpenConnection: function () { alert("打开aOracle连接"); },
CreateCommand: function () { alert("创建¨Oracle命令"); },
ExcuteCommand: function () { alert("执行DOracle命令"); },
CloseConnection: function () { alert("关闭?Oracle连接"); }
};
with (SQLServerCommon) {
eval("forSQLServer=" + DBCommon);
}
with (OracleCommon) {
eval("forOracle=" + DBCommon);
}
forSQLServer();
forOracle();
</script>

我们又是否可以把这个看成是一个简陋的模板方法模式呢?呵呵。我们也可以把这个称为利用eval和with配合改变函数的上下文。
不过话又说回来,Eval在一般的情况中是很少被用到的,我们是完全可以避免来使用它的。
详细出处参考:http://www.jb51.net/article/21793.htm

分享到:
评论

相关推荐

    Ajax,UTF-8还是GB2312 eval 还是execScript

    在Web开发中,Ajax(Asynchronous JavaScript and XML)技术常用于实现网页的异步更新,使得用户无需刷新整个页面就能获取和更新数据。然而,Ajax在处理字符编码时可能会遇到问题,特别是当服务器返回的数据采用不同...

    深入认识javascript中得eval函数

    ### 深入认识JavaScript中的eval函数 #### 一、eval函数概述 在JavaScript中,`eval`函数是一个内置函数,它可以将字符串形式的代码解析并执行。这为开发者提供了一种灵活的方式来动态生成和执行代码。然而,由于...

    js中eval详解

    JavaScript中的`eval`函数是一个非常强大但又充满争议的工具,它可以解析并执行一个字符串作为JavaScript代码。在处理动态生成的代码或者从服务器接收到的数据时,`eval`经常被用到。然而,由于安全性和性能上的风险...

    JavaScript中eval&#40;&#41;函数用法详解

    JavaScript中的eval函数是一个非常特殊的函数,它能够计算并执行一个字符串形式的JavaScript代码。eval函数的使用方法相对简单,但是它的作用及其对作用域的影响则需要格外注意。 首先,eval函数的基本语法是eval...

    Javascript学习笔记4 Eval函数

    JavaScript中的`eval()`函数是一个非常强大但又充满争议的工具,它允许我们将字符串作为JavaScript代码执行。在初学JavaScript时,很多人可能都听说过`eval()`,但对其具体用途和潜在风险不太了解。本文将深入探讨`...

    eval与window.eval的差别分析

    JavaScript中的`eval`和`window.eval`都是用来执行动态JavaScript代码的函数,但它们在不同浏览器中的行为有所差异。理解这些差异对于编写可移植的、安全的JavaScript代码至关重要。 首先,`eval`函数是一个全局...

    深入认识javascript中的eval函数

    在JavaScript中,eval函数是一个内置的对象,主要用于执行一个字符串表达式,并返回表达式的值。eval函数的使用需要谨慎,因为它会执行一段字符串中的JavaScript代码,并且这种执行方式可能会带来安全问题。 1. ...

    解javascript 混淆加密收藏

    Js解混淆最关键的部分: l eval或者[removed]、VBS的EXECUTE、execScript之类的可以运行js的函数 l unescape js的混淆一般有几种方法: 1. 把代码通过escape转换成hex形式的代码,让人看不懂 2. 把代码进行简单的...

    javascript eval函数深入认识

    JavaScript 的 `eval` 函数是一个强大且复杂的工具,主要用于将字符串转化为可执行的 ...对于在函数内部执行全局代码,可以利用浏览器的特定方法,如 `execScript` 和 `window.eval`,但也要注意浏览器兼容性问题。

    javascript eval&#40;func(&#41;)使用示例

    需要注意的是,eval()和with语句通常不推荐在现代JavaScript编码实践中使用,因为它们可能导致代码难以理解、难以维护,还可能影响性能。现代JavaScript开发中,更加推荐使用更加安全、性能更好的方法来实现类似的...

    7种JS加密解密方法

    它们都是早期JavaScript中用于处理URL字符串的方法,但已被 `encodeURI()` 和 `decodeURI()` 所取代。 **编码示例**: ```javascript // 使用escape()方法编码字符串 var encodedStr = escape("黑客防线"); console...

    VC调用javascript的几种方法(推荐)

    具体实现是首先需要在项目中引入msscript.ocx文件,然后在OnDocumentComplete事件中获取文档的父窗口,并将窗口对象添加到IScriptControl对象中,之后即可使用raw_Eval方法执行JavaScript代码。 以上三种方法各有优...

    VC调用javascript的几种方法(推荐).docx

    本文介绍了三种常用的VC调用JavaScript的方法:通过`execScript`方法调用、使用`GetIDsOfNames`和`Invoke`方法以及利用`IScriptControl::raw_Eval`方法。每种方法都有其特点和适用场景,开发者可以根据实际需求选择...

    深入解析IE11中被废止的JS方法.docx

    其他被废弃的方法包括execScript()、window.scrollByLines()和window.scrollByPages(),以及通过link.styleSheet引用样式表的方法。这些方法都有基于W3C标准的替代方案,例如使用eval()执行JavaScript代码,以及使用...

    Ajax 动态载入html页面后不能执行其中的js快速解决方法

    接着,针对IE浏览器使用`window.execScript`,对于其他浏览器则使用`window.eval`来执行JavaScript代码。 这种方法的优点在于,它既考虑了不同浏览器的兼容性,又避免了使用eval的潜在风险,同时解决了JavaScript...

    jquery实现表单文件上传,并获取回调信息

    在IT行业中,前端开发经常会遇到文件上传的需求,jQuery作为一个广泛使用的JavaScript库,提供了方便的API来简化这个过程。本文将详细讲解如何使用jQuery实现表单文件上传并获取回调信息。 首先,我们需要理解...

Global site tag (gtag.js) - Google Analytics