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 相关文章推荐
列表内容的选择
Jun 30 Javascript
Mootools 1.2教程 排序类和方法简介
Sep 15 Javascript
js创建表单元素并使用submit进行提交
Aug 14 Javascript
jQuery多级弹出菜单插件ZoneMenu
Dec 18 Javascript
js图片模糊切换显示特效的方法
Feb 17 Javascript
TinyMCE提交AjaxForm获取不到数据的解决方法
Mar 05 Javascript
前端微信支付js代码
Jul 25 Javascript
浅谈JS中的!=、== 、!==、===的用法和区别
Sep 24 Javascript
Angular中点击li标签实现更改颜色的核心代码
Dec 08 Javascript
vue路由守卫+登录态管理实例分析
May 21 Javascript
vue实现移动端input上传视频、音频
Aug 18 Javascript
Openlayers实现测量功能
Sep 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持久连接mysql_pconnect()函数使用介绍
2012/02/05 PHP
php生成固定长度纯数字编码的方法
2015/07/09 PHP
thinkphp5 加载静态资源路径与常量的方法
2017/12/24 PHP
php 字符串中是否包含指定字符串的多种方法
2018/04/12 PHP
浅谈laravel orm 中的一对多关系 hasMany
2019/10/21 PHP
php中数组最简单的使用方法
2020/12/27 PHP
javascript ready和load事件的区别示例介绍
2013/08/30 Javascript
原生javascript模仿win8等待提示圆圈进度条
2014/04/24 Javascript
IE6-8中Date不支持toISOString的修复方法
2014/05/04 Javascript
JS实现模拟百度搜索“2012世界末日”网页地震撕裂效果代码
2015/10/31 Javascript
关于JS 预解释的相关理解
2016/06/28 Javascript
jQuery中常用动画效果函数(日常整理)
2016/09/17 Javascript
bootstrap网格系统使用方法解析
2017/01/13 Javascript
vue、react等单页面项目应该这样子部署到服务器
2018/01/03 Javascript
Vue2.0实现组件数据的双向绑定问题
2018/03/06 Javascript
通过vue-router懒加载解决首次加载时资源过多导致的速度缓慢问题
2018/04/08 Javascript
vue  directive定义全局和局部指令及指令简写
2018/11/20 Javascript
JavaScript判断数据类型有几种方法及区别介绍
2020/09/02 Javascript
[57:53]Secret vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
[08:17]Ti9 现场cosplay
2019/09/10 DOTA
Python函数中*args和**kwargs来传递变长参数的用法
2016/01/26 Python
Python实现小数转化为百分数的格式化输出方法示例
2017/09/20 Python
python+django加载静态网页模板解析
2017/12/12 Python
opencv python 2D直方图的示例代码
2018/07/20 Python
python中的时区问题
2021/01/14 Python
采用专利算法搜索最廉价的机票:CheapAir
2016/09/10 全球购物
印度在线购买电子产品网站:Croma
2020/01/02 全球购物
Lungolivigno Fashion官网:高级时装在线购物
2020/10/17 全球购物
写一个函数,要求输入一个字符串和一个字符长度,对该字符串进行分隔
2015/07/30 面试题
后勤人员自我评价怎么写
2013/09/19 职场文书
施工资料员岗位职责
2014/01/06 职场文书
幼儿园三八妇女节活动方案
2014/03/11 职场文书
模具专业求职信
2014/06/26 职场文书
优秀党员申报材料
2014/12/18 职场文书
实习介绍信范文
2015/05/05 职场文书
《植物妈妈有办法》教学反思
2016/02/23 职场文书