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 实现点击a标签的时候让其背景更换
Oct 15 Javascript
jquery给图片添加鼠标经过时的边框效果
Nov 12 Javascript
javascript动态向网页中添加表格实现代码
Feb 19 Javascript
JS实现图片产生波纹一样flash效果的方法
Feb 27 Javascript
浅谈window对象的scrollBy()方法
Jul 15 Javascript
深入浅析同源策略和跨域访问
Nov 26 Javascript
浅谈JS原型对象和原型链
Mar 02 Javascript
Javascript中的数组常用方法解析
Jun 17 Javascript
如何提高数据访问速度
Dec 26 Javascript
JavaScript Base64 作为文件上传的实例代码解析
Feb 14 Javascript
在Vue中使用Compass的方法
Mar 02 Javascript
Vue实现商品分类菜单数量提示功能
Jul 26 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
PHP中防止SQL注入攻击和XSS攻击的两个简单方法
2010/04/15 PHP
thinkphp中AJAX返回ajaxReturn()方法分析
2016/12/06 PHP
发现的以前不知道的函数
2006/09/19 Javascript
ExtJS的FieldSet的column列布局
2009/11/20 Javascript
nodejs入门详解(多篇文章结合)
2012/03/07 NodeJs
JavaScript初学者应注意的七个细节详细介绍
2012/12/27 Javascript
jQuery之日期选择器的深入解析
2013/06/19 Javascript
js使用for循环查询数组中是否存在某个值
2014/08/12 Javascript
原生javascript实现图片滚动、延时加载功能
2015/01/12 Javascript
jQuery实现企业网站横幅焦点图切换功能实例
2015/04/30 Javascript
利用AngularJs实现京东首页轮播图效果
2016/09/08 Javascript
jQuery无缝轮播图代码
2016/12/22 Javascript
Angular.JS实现无限级的联动菜单(使用demo)
2017/02/08 Javascript
JS库particles.js创建超炫背景粒子插件(附源码下载)
2017/09/13 Javascript
react router4+redux实现路由权限控制的方法
2018/05/03 Javascript
JS使用canvas中的measureText方法测量字体宽度示例
2019/02/02 Javascript
微信小程序textarea层级过高(盖住其他元素)问题的解决办法
2019/03/04 Javascript
解决vue的touchStart事件及click事件冲突问题
2020/07/21 Javascript
js实现星星海特效的示例
2020/09/28 Javascript
vue-router路由懒加载及实现的3种方式
2021/02/28 Vue.js
Python远程桌面协议RDPY安装使用介绍
2015/04/15 Python
对python模块中多个类的用法详解
2019/01/10 Python
Python数据正态性检验实现过程
2020/04/18 Python
Django实现任意文件上传(最简单的方法)
2020/06/03 Python
Python导入数值型Excel数据并生成矩阵操作
2020/06/09 Python
Python安装第三方库攻略(pip和Anaconda)
2020/10/15 Python
Html5页面获取微信公众号的openid的方法
2020/05/12 HTML / CSS
ALDO加拿大官网:加拿大女鞋品牌
2018/12/22 全球购物
入党自我鉴定
2014/03/25 职场文书
管理标语大全
2014/06/24 职场文书
农村党员学习党的群众路线教育实践活动心得体会
2014/11/04 职场文书
汽车销售员岗位职责
2015/04/11 职场文书
会议室使用管理制度
2015/08/06 职场文书
初中体育课教学反思
2016/02/16 职场文书
Python基础详解之邮件处理
2021/04/28 Python
Win11更新失败并提示0xc1900101
2022/04/19 数码科技