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中的常见排序算法
Mar 27 Javascript
用JavaScrpt实现文件夹简单轻松加密的实现方法图文
Sep 08 Javascript
解析页面加载与js函数的执行 onload or ready
Dec 12 Javascript
javascript生成随机颜色示例代码
May 05 Javascript
JavaScript的null和undefined区别示例介绍
Sep 15 Javascript
Jqgrid之强大的表格插件应用
Dec 02 Javascript
AngularJs  Understanding Angular Templates
Sep 02 Javascript
javascript 利用arguments实现可变长参数
Nov 21 Javascript
three.js快速入门【推荐】
Jan 21 Javascript
如何利用node.js开发一个生成逐帧动画的小工具
Dec 01 Javascript
浅谈Vue3.0新版API之composition-api入坑指南
Apr 30 Javascript
javascript实现一款好看的秒表计时器
Sep 05 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实现信用卡校验位算法THE LUHN MOD-10示例
2014/05/07 PHP
浅谈PHP中JSON数据操作
2015/07/01 PHP
thinkPHP5.0框架独立配置与动态配置方法
2017/03/17 PHP
yii gridview实现时间段筛选功能
2017/08/15 PHP
TP5框架请求响应参数实例分析
2019/10/17 PHP
将函数的实际参数转换成数组的方法
2010/01/25 Javascript
Node.js生成HttpStatusCode辅助类发布到npm
2013/04/09 Javascript
简介JavaScript中valueOf()方法的使用
2015/06/05 Javascript
javascript学习总结之js使用技巧
2015/09/02 Javascript
AngularJS在IE下取数据总是缓存问题的解决方法
2016/08/05 Javascript
html、css和jquery相结合实现简单的进度条效果实例代码
2016/10/24 Javascript
jQuery中页面返回顶部的方法总结
2016/12/30 Javascript
JS控件bootstrap suggest plugin使用方法详解
2017/03/25 Javascript
微信小程序引用公共js里的方法的实例详解
2017/08/17 Javascript
JavaScript实现简单生成随机颜色的方法
2017/09/21 Javascript
实现div滚动条默认最底部以及默认最右边的示例代码
2017/11/15 Javascript
jQuery 操作 HTML 元素和属性的方法
2018/11/12 jQuery
微信小程序实现搜索功能并跳转搜索结果页面
2019/05/18 Javascript
在vue中实现给每个页面顶部设置title
2020/07/29 Javascript
基于Vue+Webpack拆分路由文件实现管理
2020/11/16 Javascript
Django中ORM表的创建和增删改查方法示例
2017/11/15 Python
Python语言描述最大连续子序列和
2017/12/05 Python
python框架中flask知识点总结
2018/08/17 Python
Python装饰器语法糖
2019/01/02 Python
对dataframe数据之间求补集的实例详解
2019/01/30 Python
Python中面向对象你应该知道的一下知识
2019/07/10 Python
python编程进阶之异常处理用法实例分析
2020/02/21 Python
利用keras使用神经网络预测销量操作
2020/07/07 Python
英国最大的手表网站:The Watch Hut
2017/03/31 全球购物
Tomcat中怎么使用log4j输出所有的log
2016/07/07 面试题
办理生育手续介绍信
2014/01/14 职场文书
2014年党务公开实施方案
2014/02/27 职场文书
程序员求职信
2014/04/16 职场文书
2014年办公室工作总结范文
2014/11/12 职场文书
2014年体育教师工作总结
2014/12/03 职场文书
质量整改通知单
2015/04/21 职场文书