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的一些特性和用法整理小结
Jan 13 Javascript
jquery插件制作 提示框插件实现代码
Aug 17 Javascript
js获取网页高度(详细整理)
Dec 28 Javascript
js去字符串前后空格5种实现方法及比较
Apr 03 Javascript
JavaScript设计模式经典之工厂模式
Feb 24 Javascript
js实现把图片的绝对路径转为base64字符串、blob对象再上传
Dec 29 Javascript
AngularJS折叠菜单实现方法示例
May 18 Javascript
Webpack4+Babel7+ES6兼容IE8的实现
Apr 10 Javascript
微信小程序云开发之使用云存储
May 17 Javascript
微信小程序 网络通信实现详解
Jul 23 Javascript
JavaScript canvas实现雪花随机动态飘落
Feb 08 Javascript
vue配置型表格基于el-table拓展之table-plus组件
Apr 12 Vue.js
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操作MongoDB时的整数问题及对策说明
2011/05/02 PHP
php小技巧之过滤ascii控制字符
2014/05/14 PHP
PHP实现根据银行卡号判断银行
2015/04/29 PHP
php超快高效率统计大文件行数
2015/07/05 PHP
php基于CodeIgniter实现图片上传、剪切功能
2016/05/14 PHP
PHP7内核CGI与FastCGI详解
2019/04/14 PHP
解决js数据包含加号+通过ajax传到后台时出现连接错误
2013/08/01 Javascript
JavaScript prototype 使用介绍
2013/08/29 Javascript
判断访客终端类型集锦
2015/06/05 Javascript
浅析Nodejs npm常用命令
2016/06/14 NodeJs
js判断checkbox是否选中个数的方法(超简单)
2016/08/19 Javascript
Angular2  NgModule 模块详解
2016/10/19 Javascript
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
2016/12/14 Javascript
详谈js模块化规范
2017/07/07 Javascript
谈谈对vue响应式数据更新的误解
2017/08/01 Javascript
html中通过JS获取JSON数据并加载的方法
2017/11/30 Javascript
NodeJs搭建本地服务器之使用手机访问的实例讲解
2018/05/12 NodeJs
微信小程序实现自上而下字幕滚动
2018/07/14 Javascript
解决vuejs 使用value in list 循环遍历数组出现警告的问题
2018/09/26 Javascript
Python下的Mysql模块MySQLdb安装详解
2014/04/09 Python
通过5个知识点轻松搞定Python的作用域
2016/09/09 Python
利用PyInstaller将python程序.py转为.exe的方法详解
2017/05/03 Python
django 快速启动数据库客户端程序的方法示例
2019/08/16 Python
Python Web框架之Django框架cookie和session用法分析
2019/08/16 Python
numpy求平均值的维度设定的例子
2019/08/24 Python
Django使用消息提示简单的弹出个对话框实例
2019/11/15 Python
PyTorch的torch.cat用法
2020/06/28 Python
艺术节主持词
2014/04/02 职场文书
计生工作先进事迹
2014/08/15 职场文书
四风问题自查自纠工作情况报告
2014/10/28 职场文书
员工工作及收入证明
2014/10/28 职场文书
药品开票员岗位职责
2015/04/15 职场文书
恋恋笔记本观后感
2015/06/16 职场文书
七年级话题作文之执着
2019/11/19 职场文书
Python接口自动化之文件上传/下载接口详解
2022/04/05 Python
Python+OpenCV实现图片中的圆形检测
2022/04/07 Python