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 相关文章推荐
使用jquery获取网页中图片高度的两种方法
Sep 26 Javascript
使用jQuery.wechat构建微信WEB应用
Oct 09 Javascript
javascript实现可拖动变色并关闭层窗口实例
May 15 Javascript
ECMAScript6块级作用域及新变量声明(let)
Jun 12 Javascript
jQuery添加和删除指定标签的方法
Dec 16 Javascript
jQuery基础的工厂函数以及定时器的经典实例分析
May 20 Javascript
jQuery实现调整表格单列顺序完整实例
Jun 20 Javascript
js判断是否为空和typeof的用法(详解)
Oct 07 Javascript
javascript数据类型详解
Feb 07 Javascript
JavaScript for循环 if判断语句(学习笔记)
Oct 11 Javascript
微信小程序实现自定义picker选择器弹窗内容
May 26 Javascript
layui-table表复选框勾选的所有行数据获取的例子
Sep 13 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
怎样辨别一杯好咖啡
2021/03/03 新手入门
PHP四舍五入精确小数位及取整
2014/01/14 PHP
php获取QQ头像并显示的方法
2014/12/23 PHP
ThinkPHP数据操作方法总结
2015/09/28 PHP
PHP利用正则表达式将相对路径转成绝对路径的方法示例
2017/02/28 PHP
php分页查询的简单实现代码
2017/03/14 PHP
javascript 控制弹出窗口
2007/04/10 Javascript
jquery dialog open后,服务器端控件失效的快速解决方法
2013/12/19 Javascript
js日期联动示例
2014/05/02 Javascript
jQuery简单实现QQ空间点赞已经取消点赞
2015/04/02 Javascript
深入浅析AngularJS中的module(模块)
2016/01/04 Javascript
JS实现环形进度条(从0到100%)效果
2016/07/05 Javascript
Vue项目中引入外部文件的方法(css、js、less)
2017/07/24 Javascript
node.js通过axios实现网络请求的方法
2018/03/05 Javascript
浅析Vue中method与computed的区别
2018/03/06 Javascript
如何用webpack4.0撸单页/多页脚手架 (jquery, react, vue, typescript)
2019/06/18 jQuery
详解vue中v-bind:style效果的自定义指令
2020/01/21 Javascript
vue中全局路由守卫中替代this操作(this.$store/this.$vux)
2020/07/24 Javascript
Python3 Random模块代码详解
2017/12/04 Python
python 3.6 +pyMysql 操作mysql数据库(实例讲解)
2017/12/20 Python
Flask之请求钩子的实现
2018/12/23 Python
Python使用Shelve保存对象方法总结
2019/01/28 Python
python利用Excel读取和存储测试数据完成接口自动化教程
2020/04/30 Python
Windows 平台做 Python 开发的最佳组合(推荐)
2020/07/27 Python
Python基于unittest实现测试用例执行
2020/11/25 Python
CSS3模拟动画下拉菜单效果
2017/04/12 HTML / CSS
Origins悦木之源香港官网:雅诗兰黛集团高端植物护肤品牌
2018/03/21 全球购物
Made in Design英国:设计家具、照明、家庭装饰和花园家具
2019/09/24 全球购物
计算机应用专业学生的自我评价分享
2013/11/03 职场文书
工作会议主持词
2014/03/17 职场文书
建筑管理专业求职信
2014/07/28 职场文书
2014国庆节演讲稿:祖国在我心中(400字)
2014/09/25 职场文书
离婚案件原告代理词
2015/05/23 职场文书
花木兰观后感
2015/06/10 职场文书
Python基础之元组与文件知识总结
2021/05/19 Python
Python基本数据类型之字符串str
2021/07/21 Python