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 Flash插入函数免激活代码
Mar 31 Javascript
用jquery实现输入框获取焦点消失文字
Apr 27 Javascript
js与jQuery 获取父窗、子窗的iframe
Dec 20 Javascript
node.js中的fs.link方法使用说明
Dec 15 Javascript
javascript正则表达式模糊匹配IP地址功能示例
Jan 06 Javascript
Vue.js结合bootstrap实现分页控件
Mar 10 Javascript
vue单页应用中如何使用jquery的方法示例
Jul 27 jQuery
JS实现网页抢购功能(触发,终止脚本)
Nov 27 Javascript
Vue不能检测到Object/Array更新的情况的解决
Jun 26 Javascript
微信小程序实现折叠展开效果
Jul 19 Javascript
如何解决日期函数new Date()浏览器兼容性问题
Sep 11 Javascript
js实现自动锁屏功能
Jun 02 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中ob(Output Buffer 输出缓冲)函数使用方法
2007/07/21 PHP
php中计算时间差的几种方法
2009/12/31 PHP
PHP加密函数 Javascript/Js 解密函数
2013/09/23 PHP
php环境下利用session防止页面重复刷新的具体实现
2014/01/09 PHP
PHP实现可自定义样式的分页类
2016/03/29 PHP
PHP7 新特性详细介绍
2016/09/06 PHP
PHP实现的mongoDB数据库操作类完整实例
2018/04/10 PHP
事件冒泡是什么如何用jquery阻止事件冒泡
2013/03/20 Javascript
jquery操作复选框(checkbox)的12个小技巧总结
2014/02/04 Javascript
javascript制作的网页侧边弹出框思路及实现代码
2014/05/21 Javascript
jQuery网页选项卡插件rTabs用法实例分析
2015/08/26 Javascript
jQuery实现form表单元素序列化为json对象的方法
2015/12/09 Javascript
jquery实现的table排序功能示例
2017/03/10 Javascript
vue-scroller记录滚动位置的示例代码
2018/01/17 Javascript
JavaScript JMap类定义与使用方法示例
2019/01/22 Javascript
react同构实践之实现自己的同构模板
2019/03/13 Javascript
详解Js里的for…in和for…of的用法
2019/03/28 Javascript
JS通过ajax + 多列布局 + 自动加载实现瀑布流效果
2019/05/30 Javascript
PHP读取远程txt文档到数组并实现遍历
2020/08/25 Javascript
[01:05:56]2018DOTA2亚洲邀请赛3月29日 小组赛A组 Newbee VS VG
2018/03/30 DOTA
浅谈Python的文件类型
2016/05/30 Python
分享vim python缩进等一些配置
2018/07/02 Python
Python3.7 新特性之dataclass装饰器
2019/05/27 Python
如何用Python制作微信好友个性签名词云图
2019/06/28 Python
pandas删除行删除列增加行增加列的实现
2019/07/06 Python
快速解决vue.js 模板和jinja 模板冲突的问题
2019/07/26 Python
python3 反射的四种基本方法解析
2019/08/26 Python
HTML5拖拽文件上传的示例代码
2021/03/04 HTML / CSS
世界首屈一指的钓鱼用品商店:TackleDirect
2016/07/26 全球购物
Mio Skincare美国官网:身体紧致及孕期身体护理
2017/03/05 全球购物
财务管理职业生涯规划范文
2013/12/27 职场文书
中学生爱国演讲稿
2013/12/31 职场文书
文明寝室申报材料
2014/05/12 职场文书
施工单位工程部经理岗位职责
2015/04/09 职场文书
导游词之襄阳古城
2019/09/27 职场文书
前端学习——JavaScript原生实现购物车案例
2021/03/31 Javascript