JavaScript中的eval()函数使用介绍


Posted in Javascript onDecember 31, 2014

在JavaScript中,可以使用eval()函数来解析字符串中的JavaScript代码,并返回相应的代码执行结果:

console.log(eval("42 * 2"));//84

就本质而言,eval()是JavaScript全局对象的一个函数。比如,上述代码等价于:

console.log(this.eval("42 * 2"));//84

不过在使用eval()语句时,一般都采用上述第一种做法,也即忽略全局对象直接使用eval()。

eval()的使用

基于以下两个原因,除非确实需要,不然应尽量避免在代码中使用eval()语句:

1.从逻辑上来说,字符串应该用于储存程序运行过程中的内容、信息,而不应该用于储存具体的计算逻辑。
2.由于eval()参数为字符串,而对于一段字符串无法词法进行,因此对于eval()调用语句,JavaScript解释器无法进行优化。

eval()的返回值

eval()的返回值遵循以下规则:

1.如果eval()的参数不是字符串,那么eval()将直接返回参数。
2.如果eval()的参数是字符串,那么eval()将这个字符串解析成代码后进行执行,并返回最后一行代码执行的结果。
3.如果字符串无法解析成合法的代码,eval()将抛出SyntaxError错误。
4.如果字符串能够被解析成合法的代码,但是在执行这一代码过程中报错,那么这个错误会上报给eval()语句,并由eval()抛出。

console.log(eval([1,2,3]));//[1, 2, 3]

console.log(typeof eval([1,2,3]));//object
console.log(eval("42 */ 2"));//SyntaxError

console.log(eval("42 * 2; 22 * 3;"));//66. eval returns the result of last expression/statement

console.log(eval("null.toString()"));//TypeError, exception in eval-ed code will be propagated outside eval().

变量环境(variable environment)

JavaScript中eval()有一个重要的特性:eval()参数字符串中的代码可以访问外部代码中的变量,同时也可以将参数字符串代码中新建的变量暴露给外部代码。也即,如果eval()参数字符串可以被合法解析,那么JS会将解析后的代码替换掉eval()所在的那一行:

//variable environment

var a = 108;

console.log(eval("function double(x){return x*2;} a = double(a)"));

console.log(a);//216

console.log(double(33));//66

值得注意的是,实现上述特性的前提是eval()参数字符串中的代码可以被合法解析。除了代码语法正确外,JS还要求eval()参数字符串中的代码必须“自成一体”:仅就参数字符串中的代码而言,代码必须是有意义的。比如,无法将诸如“return;”这样的字符串传给eval()函数:

function test(){

  var s = "test";

  eval("return s;");

}

test();//SyntaxError: return not in function

如果直接使用eval()函数,那么eval()参数字符串中的代码所访问的变量是eval()语句所在function的那些变量,也即eval()函数所使用的变量环境是“本地变量环境”。如果不直接使用eval()函数,而是使用一个同样指向eval()函数的新变量,那么相应参数字符串中的代码所访问的变量均为全局变量,也即eval()函数所使用的变量环境是“全局变量环境”:

//local variable environment and global variable environment

var renamed = eval;

var x = "origin", y = "origin";

function f(){

  var x = "new";

  eval("x += 'Changed';");

  return x;

}

function g(){

  var y = "new";

  renamed("y += 'Changed';");

  return y;

}

console.log(f(), x);//newChanged origin

console.log(g(), y);//new originChanged

不过,值得注意的是,IE6、7、8中的行为与此不同。在IE6、7、8中,即使eval()函数被重命名,所使用的也依然是“本地变量环境”。

Javascript 相关文章推荐
JQuery Dialog(JS 模态窗口,可拖拽的DIV)
Feb 07 Javascript
JS维吉尼亚密码算法实现代码
Nov 09 Javascript
再论Javascript的类继承
Mar 05 Javascript
IE6、IE7中setAttribute不支持class/for/rowspan/colspan等属性
Aug 28 Javascript
对JavaScript客户端应用编程的一些建议
Jun 24 Javascript
JS获取月份最后天数、最大天数与某日周数的方法
Dec 08 Javascript
JavaScript图像延迟加载库Echo.js
Apr 05 Javascript
微信小程序 scroll-view实现上拉加载与下拉刷新的实例
Jan 21 Javascript
使用JavaScript中的lodash编写双色球效果
Jun 24 Javascript
vue分页插件的使用方法
Dec 25 Javascript
jQuery+PHP+Ajax实现动态数字统计展示功能
Dec 25 jQuery
JS新手入门数组处理的实用方法汇总
Apr 07 Javascript
JSONP跨域GET请求解决Ajax跨域访问问题
Dec 31 #Javascript
JavaScript中的异常捕捉介绍
Dec 31 #Javascript
JavaScript中对象介绍
Dec 31 #Javascript
JavaScript中用字面量创建对象介绍
Dec 31 #Javascript
javascript设计模式之中介者模式Mediator
Dec 30 #Javascript
javascript实现window.print()去除页眉页脚
Dec 30 #Javascript
Javascript访问器属性实例分析
Dec 30 #Javascript
You might like
高亮度显示php源代码
2006/10/09 PHP
PHP正则表达式 /i, /is, /s, /isU等介绍
2014/10/23 PHP
PHP单例模式是什么 php实现单例模式的方法
2016/05/14 PHP
php mysql PDO 查询操作的实例详解
2017/09/23 PHP
Gird组件 Part-3:范例RSSFeed Viewer
2007/03/10 Javascript
jquery插件 cluetip 关键词注释
2010/01/12 Javascript
jQuery插件分享之分页插件jqPagination
2014/06/06 Javascript
jQuery的position()方法详解
2015/07/19 Javascript
jQuery简单实现中间浮窗效果
2016/09/04 Javascript
使用JS实现图片展示瀑布流效果(简单实例)
2016/09/06 Javascript
seajs模块之间依赖的加载以及模块的执行
2016/10/21 Javascript
常用JS图片滚动(无缝、平滑、上下左右滚动)代码大全(推荐)
2016/12/20 Javascript
jQuery实现单击按钮遮罩弹出对话框效果(1)
2017/02/20 Javascript
深入理解Javascript中的作用域链和闭包
2017/04/25 Javascript
微信小程序用户信息encryptedData详解
2018/08/24 Javascript
浅谈Vue项目骨架屏注入实践
2019/08/05 Javascript
Vue 实现从文件中获取文本信息的方法详解
2019/10/16 Javascript
vue项目中使用vue-layer弹框插件的方法
2020/03/11 Javascript
Vue+Element ui 根据后台返回数据设置动态表头操作
2020/09/21 Javascript
Python实现的递归神经网络简单示例
2017/08/11 Python
使用celery和Django处理异步任务的流程分析
2020/02/19 Python
python递归函数用法详解
2020/10/26 Python
MVMT手表官方网站:时尚又实惠的高品质手表
2016/12/04 全球购物
维也纳通行证:Vienna PASS
2019/07/18 全球购物
为数据库创建索引都需要注意些什么
2012/07/17 面试题
留学自荐信的技巧
2013/10/17 职场文书
公务员个人自我评价分享
2013/11/06 职场文书
自荐书模板
2013/12/15 职场文书
十佳青年个人事迹材料
2014/01/28 职场文书
40岁生日感言
2014/02/15 职场文书
竞选学生会演讲稿
2014/04/25 职场文书
新学期开学标语
2014/06/30 职场文书
环境日宣传活动总结
2014/07/09 职场文书
乐山大佛导游词
2015/02/02 职场文书
我在伊朗长大观后感
2015/06/16 职场文书
小区物业管理2015年度工作总结
2015/10/22 职场文书