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 相关文章推荐
Js与Jq 获取页面元素值的方法和差异对比
Apr 30 Javascript
javascript+ajax实现产品页面加载信息
Jul 09 Javascript
模拟javascript中的sort排序(简单实例)
Aug 17 Javascript
JavaScript正则表达式小结(test|match|search|replace|split|exec)
Dec 08 Javascript
jQuery EasyUi 验证功能实例解析
Jan 06 Javascript
js实现常见的工具条效果
Mar 02 Javascript
vue获取DOM元素并设置属性的两种实现方法
Sep 30 Javascript
微信小程序下拉框组件使用方法详解
Dec 28 Javascript
js中!和!!的区别与用法
May 09 Javascript
vue使用nprogress加载路由进度条的方法
Jun 04 Javascript
node中使用shell脚本的方法步骤
Mar 23 Javascript
Vue如何清空对象
Mar 03 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打开和关闭文件操作函数总结
2014/11/18 PHP
thinkphp判断访客为手机端或PC端的方法
2014/11/24 PHP
PHP扩展模块memcached长连接使用方法分析
2014/12/24 PHP
PHP开发APP端微信支付功能
2017/02/17 PHP
php格式文件打开的四种方法
2018/02/24 PHP
jQuery.Validate验证库的使用介绍
2013/04/26 Javascript
jQuery中after的两种用法实例
2013/07/03 Javascript
Nodejs Post请求报socket hang up错误的解决办法
2014/09/25 NodeJs
Uploadify上传文件方法
2016/03/16 Javascript
JS原型链怎么理解
2016/06/27 Javascript
JavaScript实现横线提示输入验证码随输入验证码输入消失的方法
2016/09/24 Javascript
简单理解vue中track-by属性
2016/10/26 Javascript
浅谈JS函数定义方式的区别
2016/10/30 Javascript
图文详解Javascript中的上下文和作用域
2017/02/15 Javascript
AngularJS表单验证功能
2017/10/19 Javascript
nodejs实现的连接MySQL数据库功能示例
2018/01/25 NodeJs
js实现移动端轮播图
2020/12/21 Javascript
浅谈Node框架接入ELK实践总结
2019/02/22 Javascript
vue2之简易的pc端短信验证码的问题及处理方法
2019/06/03 Javascript
跟老齐学Python之??碌某?? target=
2014/09/12 Python
Python创建xml的方法
2015/03/10 Python
使用SAE部署Python运行环境的教程
2015/05/05 Python
详解python环境安装selenium和手动下载安装selenium的方法
2020/03/17 Python
Python按照list dict key进行排序过程解析
2020/04/04 Python
python爬虫工具例举说明
2020/11/30 Python
英国门销售网站:Green Tree Doors
2020/01/07 全球购物
网络信息管理员岗位职责
2014/01/05 职场文书
大学生优秀团员事迹材料
2014/01/30 职场文书
小学生自我评价100字(15篇)
2014/09/18 职场文书
2014年人力资源部工作总结
2014/11/19 职场文书
2015暑期社会实践个人总结
2015/07/13 职场文书
同事离别感言
2015/08/04 职场文书
学困生帮扶工作总结
2015/08/13 职场文书
小学教师教学随笔
2015/08/14 职场文书
2016年中学植树节活动总结
2016/03/16 职场文书
Java结构型设计模式之组合模式详解
2022/09/23 Java/Android