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的document.ready更快的方法
Apr 28 Javascript
javascript获取web应用根目录的方法
Feb 12 Javascript
thinkphp 表名 大小写 窍门
Feb 01 Javascript
jQuery中$.ajax()和$.getJson()同步处理详解
Aug 12 Javascript
Javascript字符串拼接小技巧(推荐)
Jun 02 Javascript
javascript url几种编码方式详解
Jun 06 Javascript
js验证框架之RealyEasy验证详解
Jun 08 Javascript
vue开发心得和技巧分享
Oct 27 Javascript
11个教程中不常被提及的JavaScript小技巧(推荐)
Apr 17 Javascript
一次让你了解全部JavaScript的作用域
Jun 24 Javascript
vue+axios 拦截器实现统一token的案例
Sep 11 Javascript
React-vscode使用jsx语法的问题及解决方法
Jun 21 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
flash用php连接数据库的代码
2011/04/21 PHP
phpmail类发送邮件函数代码
2012/02/20 PHP
PHP使用Redis替代文件存储Session的方法
2017/02/15 PHP
php注册审核重点解析(数据访问)
2017/05/23 PHP
PHP使用Curl实现模拟登录及抓取数据功能示例
2018/04/27 PHP
Laravel框架处理用户的请求操作详解
2019/12/20 PHP
js 实现浏览历史记录示例
2014/04/20 Javascript
Javascript验证方法大全
2015/09/21 Javascript
JS实现自定义简单网页软键盘效果代码
2015/11/05 Javascript
原生js页面滚动延迟加载图片
2015/12/20 Javascript
JS验证字符串功能
2017/02/22 Javascript
Vue项目中quill-editor带样式编辑器的使用方法
2017/08/08 Javascript
JS实现textarea通过换行或者回车把多行数字分割成数组并且去掉数组中空的值
2018/10/29 Javascript
JQueryDOM之样式操作
2019/03/27 jQuery
JS实现的字符串数组去重功能小结
2019/06/17 Javascript
jquery选择器和属性对象的操作实例分析
2020/01/10 jQuery
微信小程序点击滚动到指定位置的实现
2020/05/22 Javascript
[05:43]VG.R战队教练Mikasa专访:为目标从未停止战斗
2016/08/02 DOTA
Python实现向QQ群成员自动发邮件的方法
2014/11/19 Python
python+selenium实现自动抢票功能实例代码
2018/11/23 Python
Python设计模式之简单工厂模式实例详解
2019/01/22 Python
Python实现微信中找回好友、群聊用户撤回的消息功能示例
2019/08/23 Python
python多继承(钻石继承)问题和解决方法简单示例
2019/10/21 Python
美国网上订购鲜花:FTD
2016/09/23 全球购物
美国庭院家具购物网站:AlphaMarts
2019/04/10 全球购物
请写出一段Python代码实现删除一个list里面的重复元素
2015/12/29 面试题
银行毕业实习自我鉴定
2013/09/19 职场文书
实习护理工作自我评价
2013/09/25 职场文书
《阳光》教学反思
2014/02/23 职场文书
校企合作协议书
2014/04/16 职场文书
勤俭节约演讲稿
2014/05/08 职场文书
小学生感恩父母演讲稿
2014/08/28 职场文书
教师自查自纠工作情况报告
2014/10/29 职场文书
2015国庆节宣传语
2015/07/14 职场文书
关于环保的广播稿
2015/12/17 职场文书
Python极值整数的边界探讨分析
2021/09/15 Python