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 相关文章推荐
用javascript动态调整iframe高度的方法
Mar 06 Javascript
JS启动应用程序的一个简单例子
May 11 Javascript
解析dom中的children对象数组元素firstChild,lastChild的使用
Jul 10 Javascript
不使用浏览器运行javascript代码的方法
Jul 24 Javascript
jquery 鼠标滑动显示详情应用示例
Jan 24 Javascript
JQuery教学之性能优化
May 14 Javascript
webpack进阶——缓存与独立打包的用法
Aug 02 Javascript
jQuery取得元素标签名称小结(附代码)
Aug 16 jQuery
原生JS实现的跳一跳小游戏完整实例
Jan 27 Javascript
vue draggable resizable 实现可拖拽缩放的组件功能
Jul 15 Javascript
详细教你微信公众号正文页SVG交互开发技巧
Jul 25 Javascript
使用webpack和rollup打包组件库的方法
Feb 25 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实现的生成静态HTML速度快类库
2007/03/31 PHP
php将数据库中所有内容生成静态html文档的代码
2010/04/12 PHP
PHP合并两个数组的两种方式的异同
2012/09/14 PHP
PHP内置的Math函数效率测试
2014/12/01 PHP
谈谈PHP中substr和substring的正确用法及相关参数的介绍
2015/12/16 PHP
php中的常用魔术方法汇总
2016/02/14 PHP
Yii2主题(Theme)用法详解
2016/07/23 PHP
PHP正则替换函数preg_replace()报错:Notice Use of undefined constant的解决方法分析
2017/02/04 PHP
PHP简单计算两个时间差的方法示例
2017/06/20 PHP
Div自动滚动到末尾的代码
2008/10/26 Javascript
JavaScript 实现类的多种方法实例
2013/05/01 Javascript
jquery库文件略庞大用纯js替换jquery的方法
2014/08/12 Javascript
php常见的页面跳转方法汇总
2015/04/15 Javascript
JavaScript入门系列之知识点总结
2016/03/24 Javascript
angularjs之$timeout指令详解
2017/06/13 Javascript
微信小程序 配置顶部导航条标题颜色的实现方法
2017/09/20 Javascript
Javascript 编码约定(编码规范)
2018/03/11 Javascript
基于layui数据表格以及传数据的方式
2018/08/19 Javascript
Vue监听数据渲染DOM完以后执行某个函数详解
2018/09/11 Javascript
JS+canvas画布实现炫酷的旋转星空效果示例
2019/02/13 Javascript
vue路由跳转传参数的方法
2019/05/06 Javascript
python 读文件,然后转化为矩阵的实例
2018/04/23 Python
python实现图片筛选程序
2018/10/24 Python
Django利用cookie保存用户登录信息的简单实现方法
2019/05/27 Python
基于python框架Scrapy爬取自己的博客内容过程详解
2019/08/05 Python
python中的数组赋值与拷贝的区别详解
2019/11/26 Python
Python OrderedDict字典排序方法详解
2020/05/21 Python
美国最大点评网站:Yelp
2018/02/14 全球购物
印度购买眼镜和太阳镜网站:Coolwinks
2018/09/26 全球购物
美国电子产品主要品牌的授权在线零售商:DataVision
2019/03/23 全球购物
运动会加油口号
2014/06/07 职场文书
教师批评与自我批评心得体会
2014/10/16 职场文书
贫困生助学金感谢信
2015/01/21 职场文书
2016秋季小学开学寄语
2015/12/03 职场文书
Redis延迟队列和分布式延迟队列的简答实现
2021/05/13 Redis
Matplotlib可视化之添加让统计图变得简单易懂的注释
2021/06/11 Python