javascript eval(func())使用示例


Posted in Javascript onDecember 05, 2013

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在一般的情况中是很少被用到的,我们是完全可以避免来使用它的。

Javascript 相关文章推荐
JScript的条件编译
May 29 Javascript
javascript 写类方式之七
Jul 05 Javascript
用jQuery实现一些导航条切换,显示隐藏的实例代码
Jun 08 Javascript
jquery配合css简单实现返回顶部效果
Sep 30 Javascript
Javascript 运动中Offset的bug解决方案
Dec 24 Javascript
jQuery插件ajaxFileUpload使用实例解析
Oct 19 Javascript
js中document.referrer实现移动端返回上一页
Feb 22 Javascript
基于js文件加载优化(详解)
Jan 03 Javascript
使用ng-packagr打包Angular的方法示例
Sep 21 Javascript
详解vue为什么要求组件模板只能有一个根元素
Jul 22 Javascript
Jquery异步上传文件代码实例
Nov 13 jQuery
ECharts transform数据转换和dataZoom在项目中使用
Dec 24 Javascript
javascript中的作用域和上下文使用简要概述
Dec 05 #Javascript
jquery.cookie() 方法的使用(读取、写入、删除)
Dec 05 #Javascript
千分位数字格式化(用逗号隔开 代码已做了修改 支持0-9位逗号隔开)的JS代码
Dec 05 #Javascript
jquery导航制件jquery鼠标经过变色效果示例
Dec 05 #Javascript
javascript拖拽上传类库DropzoneJS使用方法
Dec 05 #Javascript
jquery上传插件fineuploader上传文件使用方法(jquery图片上传插件)
Dec 05 #Javascript
JS获取html对象的几种方式介绍
Dec 05 #Javascript
You might like
PHP中路径问题的解决方案
2006/10/09 PHP
PHP程序员最常犯的11个MySQL错误小结
2010/11/20 PHP
PHP 删除文件与文件夹操作 unlink()与rmdir()这两个函数的使用
2011/07/17 PHP
php商品对比功能代码分享
2015/09/24 PHP
Zend Framework教程之动作的基类Zend_Controller_Action详解
2016/03/07 PHP
PHP使用php-resque库配合Redis实现MQ消息队列的教程
2016/06/29 PHP
PHP手机短信验证码实现流程详解
2018/05/17 PHP
php框架知识点的整理和补充
2021/03/01 PHP
JS 容错处理代码, 屏蔽错误信息
2021/03/09 Javascript
HTML node相关的一些资料整理
2010/01/01 Javascript
javascript中的作用域scope介绍
2010/12/28 Javascript
JS的千分位算法实现思路
2013/07/31 Javascript
jquery统计复选框选中示例
2013/11/05 Javascript
JavaScript设计模式之适配器模式介绍
2014/12/28 Javascript
javaScript事件学习小结(四)event的公共成员(属性和方法)
2016/06/09 Javascript
js实现加载更多功能实例
2016/10/27 Javascript
JS中页面与页面之间超链接跳转中文乱码问题的解决办法
2016/12/15 Javascript
jQuery实现立体式数字滚动条增加效果
2016/12/21 Javascript
微信小程序 MD5的方法详解及实例代码
2017/03/10 Javascript
vue router2.0二级路由的简单使用
2017/07/05 Javascript
Node如何后台数据库使用增删改查功能
2019/11/21 Javascript
vue-cli设置css不生效的解决方法
2020/02/07 Javascript
[04:03]辉夜杯主赛事 12月25日RECAP精彩回顾
2015/12/26 DOTA
python中使用OpenCV进行人脸检测的例子
2014/04/18 Python
python判断字符串是否纯数字的方法
2014/11/19 Python
python读取目录下所有的jpg文件,并显示第一张图片的示例
2019/06/13 Python
pygame实现打字游戏
2021/02/19 Python
Pyqt助手安装PyQt5帮助文档过程图解
2020/11/20 Python
基于CSS3的animation属性实现微信拍一拍动画效果
2020/06/22 HTML / CSS
怎样写好自荐信和推荐信
2013/12/26 职场文书
幼儿园家长会邀请函
2014/01/15 职场文书
2015年世界环境日演讲稿
2015/03/18 职场文书
课题研究阶段性总结
2015/08/13 职场文书
XX部保密工作制度范本
2019/08/27 职场文书
java设计模式--七大原则详解
2021/07/21 Java/Android
CSS 实现Chrome标签栏的技巧
2021/08/04 HTML / CSS