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 一个自定义长度的文本自动换行的函数
Aug 19 Javascript
javascript定义函数的方法
Dec 06 Javascript
关于scrollLeft,scrollTop的浏览器兼容性测试
Mar 19 Javascript
jquery 元素控制(追加元素/追加内容)介绍及应用
Apr 21 Javascript
javascript中的previousSibling和nextSibling的正确用法
Sep 16 Javascript
微信 java 实现js-sdk 图片上传下载完整流程
Oct 21 Javascript
AngularJS 文件上传控件 ng-file-upload详解
Jan 13 Javascript
微信小程序开发之从相册获取图片 使用相机拍照 本地图片上传
Apr 18 Javascript
深入解析vue 源码目录及构建过程分析
Apr 24 Javascript
基于jquery实现的tab选项卡功能示例【附源码下载】
Jun 10 jQuery
小程序卡片切换效果组件wxCardSwiper的实现
Feb 13 Javascript
vue 解决data中定义图片相对路径页面不显示的问题
Aug 13 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
星际原理概述
2020/03/04 星际争霸
加速XP搜索功能堪比vista
2007/03/22 PHP
PHP中文处理 中文字符串截取(mb_substr)和获取中文字符串字数
2011/11/10 PHP
深入了解PHP类Class的概念
2012/06/14 PHP
php基于表单密码验证与HTTP验证用法实例
2015/01/06 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
laravel实现上传图片并在页面显示的例子
2019/10/14 PHP
才发现的超链接js导致网页中GIF动画停止的解决方法
2007/11/02 Javascript
jQuery获取样式中的背景颜色属性值/颜色值
2012/12/17 Javascript
载入jQuery库的最佳方法详细说明及实现代码
2012/12/28 Javascript
JQuery表格内容过滤的实现方法
2013/07/05 Javascript
js如何实现淡入淡出效果
2020/11/18 Javascript
真正好用的js验证上传文件大小的简单方法
2016/10/27 Javascript
详解前端路由实现与react-router使用姿势
2017/08/07 Javascript
微信小程序自定义单项选择器样式
2019/07/25 Javascript
新手入门js闭包学习过程解析
2019/10/08 Javascript
node.js域名解析实现方法详解
2019/11/05 Javascript
用Python编程实现语音控制电脑
2014/04/01 Python
分析在Python中何种情况下需要使用断言
2015/04/01 Python
Django使用Mysql数据库已经存在的数据表方法
2018/05/27 Python
在Python中增加和插入元素的示例
2018/11/01 Python
基于selenium及python实现下拉选项定位select
2020/07/22 Python
Python远程方法调用实现过程解析
2020/07/28 Python
利用纯CSS3实现tab选项卡切换示例代码
2016/09/21 HTML / CSS
自荐信的两点禁忌
2013/10/30 职场文书
策划主管的工作职责
2013/11/24 职场文书
党的群众路线对照检查材料
2014/09/22 职场文书
第二批党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
2014年生活老师工作总结
2014/12/23 职场文书
无工作证明怎么写
2015/06/15 职场文书
干部考核工作总结
2015/08/12 职场文书
2016年政治理论学习心得体会
2016/01/25 职场文书
pytorch中的model.eval()和BN层的使用
2021/05/22 Python
Python开发工具Pycharm的安装以及使用步骤总结
2021/06/24 Python
SpringBoot SpringEL表达式的使用
2021/07/25 Java/Android
使用jpa之动态插入与修改(重写save)
2021/11/23 Java/Android