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滚动条多种样式,推荐
Feb 05 Javascript
js字符编码函数区别分析
Dec 28 Javascript
js操作iframe的一些方法介绍
Jun 25 Javascript
js判断浏览器类型为ie6时不执行
Jun 15 Javascript
js Object2String方便查看js对象内容
Nov 24 Javascript
jquery图片播放浏览插件prettyPhoto使用详解
Dec 19 Javascript
jQuery Uploadify 上传插件出现Http Error 302 错误的解决办法
Dec 12 Javascript
Vue 2.x教程之基础API
Mar 06 Javascript
详解如何在 vue 项目里正确地引用 jquery 和 jquery-ui的插件
Jun 01 jQuery
JS/jQuery实现简单的开关灯效果【案例】
Feb 19 jQuery
详解Nuxt内导航栏的两种实现方式
Apr 16 Javascript
JS实现简易图片自动轮播
Oct 16 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
全国FM电台频率大全 - 7 吉林省
2020/03/11 无线电
PHP获取当前url的具体方法全面解析
2013/11/26 PHP
PHP中常用的数组操作方法笔记整理
2016/05/16 PHP
Laravel Memcached缓存驱动的配置与应用方法分析
2016/10/08 PHP
根据地区不同显示时间的javascript代码
2007/08/13 Javascript
utf-8编码引起js输出中文乱码的解决办法
2010/06/23 Javascript
AJAX异步从优酷专辑中采集所有视频及信息(JavaScript代码)
2010/11/20 Javascript
克隆javascript对象的三个方法小结
2011/01/12 Javascript
jQuery jcrop插件截图使用方法
2013/11/20 Javascript
jQuery实现的一个自定义Placeholder属性插件
2014/08/11 Javascript
你所不了解的javascript操作DOM的细节知识点(一)
2015/06/17 Javascript
纯jquery实现模仿淘宝购物车结算
2015/08/20 Javascript
Angular.js初始化之ng-app的自动绑定与手动绑定详解
2017/07/31 Javascript
react中实现搜索结果中关键词高亮显示
2018/07/31 Javascript
浅析微信扫码登录原理(小结)
2018/10/29 Javascript
Javascript实现秒表倒计时功能
2018/11/17 Javascript
Vue唯一可以更改vuex实例中state数据状态的属性对象Mutation的讲解
2019/01/18 Javascript
vue基础之事件简写、事件对象、冒泡、默认行为、键盘事件实例分析
2019/03/11 Javascript
JavaScript实现简易计算器小功能
2020/10/22 Javascript
Python中标准库OS的常用方法总结大全
2017/07/19 Python
python-pyinstaller、打包后获取路径的实例
2019/06/10 Python
python爬虫之自制英汉字典
2019/06/24 Python
解决Numpy中sum函数求和结果维度的问题
2019/12/06 Python
python基于TCP实现的文件下载器功能案例
2019/12/10 Python
python3通过qq邮箱发送邮件以及附件
2020/05/20 Python
Canvas实现放大镜效果完整案例分析(附代码)
2020/11/26 HTML / CSS
美国潜水装备、水肺潜水和浮潜设备商店:Leisure Pro
2018/08/08 全球购物
美国最佳在线航班预订网站:LookupFare
2019/03/26 全球购物
美术专业个人自我评价
2014/01/18 职场文书
小学生优秀评语大全
2014/04/22 职场文书
药剂专业个人求职信范文
2014/04/29 职场文书
治庸问责心得体会
2014/09/12 职场文书
2015年毕业生自我鉴定模板
2014/09/19 职场文书
老公给老婆的检讨书(精华篇)
2014/10/18 职场文书
八年级物理教学反思
2016/02/19 职场文书
解决mysql的int型主键自增问题
2021/07/15 MySQL