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 相关文章推荐
对Web开发中前端框架与前端类库的一些思考
Mar 27 Javascript
详细解读AngularJS中的表单验证编程
Jun 19 Javascript
详解jQuery中的元素的属性和相关操作
Aug 14 Javascript
理解javascript异步编程
Jan 27 Javascript
BootStrap中jQuery插件Carousel实现轮播广告效果
Mar 27 jQuery
Angular2自定义分页组件
Apr 19 Javascript
利用 spin.js 生成等待效果(js 等待效果)
Jun 25 Javascript
Angular2关于@angular/cli默认端口号配置的问题
Jul 15 Javascript
浅谈针对Vue相同路由不同参数的刷新问题
Sep 29 Javascript
微信小程序常用的3种提示弹窗实现详解
Sep 19 Javascript
Quasar Input:type="number" 去掉上下小箭头 实现加减按钮样式功能
Apr 09 Javascript
Vue-cli3生成的Vue项目加载Mxgraph方法示例
May 31 Javascript
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
Laravel中如何增加自定义全局函数详解
2017/05/09 PHP
PHP用continue跳过本次循环中剩余代码的注意点
2017/06/27 PHP
PHP中有关长整数的一些操作教程
2019/09/11 PHP
jquery 简单的进度条实现代码
2010/03/11 Javascript
javascript中运用闭包和自执行函数解决大量的全局变量问题
2010/12/30 Javascript
如何在一个页面显示多个百度地图
2013/04/07 Javascript
jQuery+AJAX实现网页无刷新上传
2015/02/22 Javascript
javascript适合移动端的日期时间拾取器
2015/11/10 Javascript
常用javascript表单验证汇总
2020/07/20 Javascript
基于jQuery仿淘宝产品图片放大镜特效
2020/10/19 Javascript
js修改onclick动作的四种方法(推荐)
2016/08/18 Javascript
JS中静态页面实现微信分享功能
2017/02/06 Javascript
AngularJS与BootStrap模仿百度分页的示例代码
2018/05/23 Javascript
vue观察模式浅析
2018/09/25 Javascript
微信小程序实现签到功能
2018/10/31 Javascript
关于vue利用postcss-pxtorem进行移动端适配的问题
2019/11/20 Javascript
关于vue3.0中的this.$router.replace({ path: '/'})刷新无效果问题
2020/01/16 Javascript
小程序实现背景音乐播放和暂停
2020/06/19 Javascript
Python中的多行注释文档编写风格汇总
2016/06/16 Python
python opencv检测目标颜色的实例讲解
2018/04/02 Python
Python实现爬取百度贴吧帖子所有楼层图片的爬虫示例
2018/04/26 Python
Python3之不使用第三方变量,实现交换两个变量的值
2019/06/26 Python
Python利用多线程同步锁实现多窗口订票系统(推荐)
2019/12/22 Python
python实现拼接图片
2020/03/23 Python
Python自动化操作实现图例绘制
2020/07/09 Python
使用CSS3来制作消息提醒框
2015/07/12 HTML / CSS
巴西Bo.Bô官方在线商店:经营奢侈品时尚业务
2020/03/16 全球购物
SQL Server笔试题
2012/01/10 面试题
大学生入党自我鉴定
2013/10/31 职场文书
小学新教师培训方案
2014/02/03 职场文书
集中整治工作方案
2014/05/01 职场文书
食品安全工作方案
2014/05/07 职场文书
客户经理竞聘演讲稿
2014/05/15 职场文书
党员公开承诺书内容
2014/05/20 职场文书
简单聊一聊SQL注入及防止SQL注入
2022/03/23 MySQL
Flutter Navigator 实现路由传递参数
2022/04/22 Java/Android