javascript中eval函数用法分析


Posted in Javascript onApril 25, 2015

本文实例分析了javascript中eval函数用法。分享给大家供大家参考。具体分析如下:

eval()只有一个参数,如果传入的参数不是字符串,则直接返回这个参数。否则会将字符串当成js代码进行编译,如果编译失败则抛出语法错误(SyntaxError)异常。如果编译成功则开始执行这段代码,并返回字符串中的最后一个表达式或语句的值;如果最后一个表达式或语句没有值,则最终返回undefined。如果字符串抛出异常,则该异常将把该调用传递给eval();

eval()最为重要的是,它使用了调用它的变量作用域环境,即它查找变量的值和定义新变量和函数的操作和局部作用域的代码完全一样。

eval("var x = 100");
eval("var y = 11");
console.log(x * y); //x * y == 1100
eval("function foo(x){return Math.pow(x,x);}");
console.log(foo(5)); // 25

eval字符串执行时的上下文环境和调用函数的上下文环境是一样的,这不能使其作为函数的一部分来运行:

var foo = function(a){
  eval(a);
  };
foo("return;");

以上代码因为执行eval(a)的上下文是全局的,在全局上下文中使用return会抛出语法错误:return not in function.

eval()具有修改局部变量的能力,这对于js优化器来说是一个很大的问题。为了让js解释器实现更加简化,ECMAScript3标准规定了任何解释器都不允许对eval()赋予别名,如果eval()函数通过别名调用会抛出一个EvalError异常。
实际上大多数的实现不是这样的。当通过别名调用时,eval()会将其字符串当成顶层的全局代码来执行。执行代码可能会定义新的全局变量和全局函数,或给全局变量赋值,但却不能使用或修改主调用函数中的局部变量,因此不会影响到函数内部的代码优化。

而在ECMAScript5中,态度有所不同:反对抛出EvalError异常。在ECMAScript5中当直接使用非限定名来调用eval()函数时,通常称为”直接eval(direct eval)”;直接调用eval()时,总是在调用它的上下文作用域内执行。而其他的间接调用则使用全局对象作为其上下文作用域,且无法读写和定义局部变量和函数。(但实际我在firebug测试里发现,都是修改了全局变量 :( )

需要真正eval来执行代码段的场景并不多见,可能更多的会使用全局eval而不是局部eval。

IE9之前的早期版本IE当通过别名调用eval()时并不是全局eval,但IE定义了一个execScript()的全局函数来完成全局eval的功能(单核eval()稍有不同,execScript()总是返回null)。

ECMAScript5严格模式对eval函数行为施加了更多的限制。在严格模式下使用eval或eval执行代码以”use strict”指令开始时,eval是私有上下文环境中的局部eval.此外严格模式将eval列为保留字,这让eval()更像一个运算符,不能用一个别名覆盖eval()函数,并且变量名、函数名、函数参数或者异常捕获的参数都不能取名为”eval”.

希望本文所述对大家的javascript程序设计有所帮助。

Javascript 相关文章推荐
js定时器怎么写?就是在特定时间执行某段程序
Oct 11 Javascript
JQuery对class属性的操作实现按钮开关效果
Oct 11 Javascript
简介JavaScript中的setDate()方法的使用
Jun 11 Javascript
javascript与Python快速排序实例对比
Aug 10 Javascript
Bootstrap插件全集
Jul 18 Javascript
javascript九宫格图片随机打乱位置的实现方法
Mar 15 Javascript
angular.js+node.js实现下载图片处理详解
Mar 31 Javascript
浅谈关于JS下大批量异步任务按顺序执行解决方案一点思考
Jan 08 Javascript
JavaScript创建表格的方法
Apr 13 Javascript
Vue组件跨层级获取组件操作
Jul 27 Javascript
基于javascript实现移动端轮播图效果
Dec 21 Javascript
Vue2.x-使用防抖以及节流的示例
Mar 02 Vue.js
javascript属性访问表达式用法分析
Apr 25 #Javascript
javascript变量声明实例分析
Apr 25 #Javascript
javascript显式类型转换实例分析
Apr 25 #Javascript
javascript原始值和对象引用实例分析
Apr 25 #Javascript
JavaScript分页功能的实现方法
Apr 25 #Javascript
JavaScript实现图片DIV竖向滑动的方法
Apr 25 #Javascript
JavaScript实现梯形乘法表的方法
Apr 25 #Javascript
You might like
SONY SRF-40W电路分析
2021/03/02 无线电
mysql_num_rows VS COUNT 效率问题分析
2011/04/23 PHP
如何用php获取文件名后缀
2013/06/09 PHP
解决ajax+php中文乱码的方法详解
2013/06/09 PHP
php二维数组转成字符串示例
2014/02/17 PHP
php检查日期函数checkdate用法实例
2015/03/19 PHP
PHP开发api接口安全验证操作实例详解
2020/03/26 PHP
JSON序列化与解析原生JS方法且IE6和chrome测试通过
2013/09/05 Javascript
javascript强制点击广告的方法
2015/02/06 Javascript
JavaScript生成随机数的4种自定义函数分享
2015/02/28 Javascript
使用js实现的简单拖拽效果
2015/03/18 Javascript
使用js获取地址栏参数的方法推荐(超级简单)
2016/06/14 Javascript
JavaScript基于自定义函数判断变量类型的实现方法
2016/11/23 Javascript
实例解析angularjs的filter过滤器
2016/12/14 Javascript
Javascript中的神器——Promise
2017/02/08 Javascript
vue.js中引入vuex储存接口数据及调用的详细流程
2017/12/14 Javascript
js实现整体缩放页面适配移动端
2020/03/31 Javascript
python自动翻译实现方法
2016/05/28 Python
Django日志模块logging的配置详解
2017/02/14 Python
深入理解Python爬虫代理池服务
2018/02/28 Python
python如何修改装饰器中参数
2018/03/20 Python
pyhton列表转换为数组的实例
2018/04/04 Python
Python Django中间件,中间件函数,全局异常处理操作示例
2019/11/08 Python
tensorflow之变量初始化(tf.Variable)使用详解
2020/02/06 Python
伦敦剧院门票:London Theatre Direct
2018/11/21 全球购物
介绍一下SQL中union,intersect和minus
2012/04/05 面试题
大唐面试试题(CPU,UNIX等等)
2012/01/11 面试题
房地产销售计划书
2014/01/10 职场文书
流动人口婚育证明范本
2014/09/26 职场文书
社区四风存在问题及整改措施
2014/10/26 职场文书
男方婚礼答谢词
2015/01/20 职场文书
齐云山导游词
2015/02/06 职场文书
毕业生自荐信范文
2015/03/05 职场文书
工作简报格式范文
2015/07/21 职场文书
Python基础之tkinter图形化界面学习
2021/04/29 Python
golang语言指针操作
2022/04/14 Golang