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 相关文章推荐
C#中TrimStart,TrimEnd,Trim在javascript上的实现
Jan 17 Javascript
javascript表单验证和Window详解
Dec 11 Javascript
JQuery悬停控制图片轮播——代码简单
Aug 05 Javascript
对象题目的一个坑 理解Javascript对象
Dec 22 Javascript
node.js中module.exports与exports用法上的区别
Sep 02 Javascript
AngularJS入门示例之Hello World详解
Jan 04 Javascript
浅谈AngularJs 双向绑定原理(数据绑定机制)
Dec 07 Javascript
vue+element的表格实现批量删除功能示例代码
Aug 17 Javascript
利用JavaScript缓存远程窃取Wi-Fi密码的思路详解
Nov 05 Javascript
Vue项目引进ElementUI组件的方法
Nov 11 Javascript
vue瀑布流组件实现上拉加载更多
Mar 10 Javascript
nginx配置域名后的二级目录访问不同项目的配置操作
Nov 06 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 中英文语言转换类代码
2011/08/11 PHP
关于PHP session 存储方式的详细介绍
2013/06/25 PHP
常见PHP数据库解决方案分析介绍
2015/09/24 PHP
PHP实现动态获取函数参数的方法示例
2018/04/02 PHP
PHP PDOStatement::nextRowset讲解
2019/02/01 PHP
PHP利用递归函数实现无限级分类的方法
2019/03/22 PHP
extJs 下拉框联动实现代码
2010/04/09 Javascript
JS正则中的RegExp对象对象
2012/11/07 Javascript
javascript实现在网页任意处点左键弹出隐藏菜单的方法
2015/05/13 Javascript
chrome浏览器当表单自动填充时如何去除浏览器自动添加的默认样式
2015/10/09 Javascript
jQuery实现批量判断表单中文本框非空的方法(2种方法)
2015/12/09 Javascript
学习使用grunt来打包JavaScript和CSS程序的教程
2016/01/04 Javascript
Angular2从搭建环境到开发步骤详解
2016/10/17 Javascript
AngularJS中的拦截器实例详解
2017/04/07 Javascript
vue2.0父子组件间通信的实现方法
2017/04/19 Javascript
微信小程序项目总结之点赞 删除列表 分享功能
2018/06/25 Javascript
深入理解移动前端开发之viewport
2018/10/19 Javascript
详解vue 2.6 中 slot 的新用法
2019/07/09 Javascript
下载给定网页上图片的方法
2014/02/18 Python
python实现从网络下载文件并获得文件大小及类型的方法
2015/04/28 Python
使用Python将Mysql的查询数据导出到文件的方法
2019/02/25 Python
python 多线程对post请求服务器测试并发的方法
2019/06/13 Python
Python OpenCV读取中文路径图像的方法
2020/07/02 Python
英国优质鞋类专家:Robinson’s Shoes
2017/12/08 全球购物
大学生的创业计划书就该这么写
2014/01/30 职场文书
《奇妙的国际互联网》 教学反思
2014/02/25 职场文书
2014庆六一活动方案
2014/03/02 职场文书
乡镇党建工作汇报材料
2014/08/14 职场文书
大专毕业生自我鉴定范文(2篇)
2014/09/27 职场文书
单位个人查摆问题及整改措施
2014/10/28 职场文书
2014年公务员工作总结
2014/11/18 职场文书
2014年教师思想工作总结
2014/12/03 职场文书
无房证明样本
2015/06/17 职场文书
校运会通讯稿
2015/07/18 职场文书
初中历史教学反思
2016/02/19 职场文书
Python实现信息管理系统
2022/06/05 Python