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 indexOf()定义和用法
Oct 21 Javascript
javascript的函数作用域
Nov 12 Javascript
JQuery 的跨域方法推荐_可跨任何网站
May 18 Javascript
Jquery和BigFileUpload实现大文件上传及进度条显示
Jun 27 Javascript
详谈AngularJs 控制器、数据绑定、作用域
Jul 09 Javascript
详解如何让InstantClick兼容MathJax、百度统计等
Sep 12 Javascript
关于vue中 $emit的用法详解
Apr 12 Javascript
详解Vue项目中出现Loading chunk {n} failed问题的解决方法
Sep 14 Javascript
JavaScript创建、读取和删除cookie
Sep 03 Javascript
基于JavaScript实现控制下拉列表
May 08 Javascript
Ant-design-vue Table组件customRow属性的使用说明
Oct 28 Javascript
浅谈JS的二进制家族
May 09 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与XML联手进行网站编程代码实例
2008/07/10 PHP
php的ZipArchive类用法实例
2014/10/20 PHP
PHP执行linux命令常用函数汇总
2016/02/02 PHP
利用php_imagick实现复古效果的方法
2016/10/18 PHP
Javascript图像处理—亮度对比度应用案例
2013/01/03 Javascript
用jquery等比例控制图片宽高的具体实现
2014/01/28 Javascript
jquery获取对象的方法足以应付常见的各种类型的对象
2014/05/14 Javascript
js中this的用法实例分析
2015/01/10 Javascript
jQuery实现仿新浪微博浮动的消息提示框(可智能定位)
2015/10/10 Javascript
轻松掌握JavaScript代理模式
2016/08/26 Javascript
jQuery实现两列等高并自适应高度
2016/12/22 Javascript
基于vue+ bootstrap实现图片上传图片展示功能
2017/05/17 Javascript
Angular6封装http请求的步骤详解
2018/08/13 Javascript
jQuery选择器之基本过滤选择器用法实例分析
2019/02/19 jQuery
p5.js绘制创意自画像
2019/11/04 Javascript
python实现代码行数统计示例分享
2014/02/10 Python
python使用rabbitmq实现网络爬虫示例
2014/02/20 Python
Python matplotlib的使用并自定义colormap的方法
2018/12/13 Python
python 并发编程 阻塞IO模型原理解析
2019/08/20 Python
python实现图像拼接
2020/03/05 Python
python操作微信自动发消息的实现(微信聊天机器人)
2020/07/14 Python
Python csv文件记录流程代码解析
2020/07/16 Python
python 深度学习中的4种激活函数
2020/09/18 Python
使用python把xmind转换成excel测试用例的实现代码
2020/10/12 Python
Python用access判断文件是否被占用的实例方法
2020/12/17 Python
英国手工布艺沙发在线购买:Sofas & Stuff
2018/03/02 全球购物
Windows和Linux动态库应用异同
2016/07/28 面试题
中学教师实习自我鉴定
2013/09/28 职场文书
运动会通讯稿300字
2014/02/02 职场文书
导师工作推荐信范文
2014/05/17 职场文书
高效课堂标语
2014/06/26 职场文书
机械工程及其自动化专业求职信
2014/08/08 职场文书
乡镇党员干部群众路线对照检查材料思想汇报
2014/09/28 职场文书
无子女夫妻离婚协议书(4篇)
2014/10/20 职场文书
机动车交通事故协议书
2015/01/29 职场文书
带你了解CSS基础知识,样式
2021/07/21 HTML / CSS