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程序中美元符号$是什么
Jun 05 Javascript
javascript 支持链式调用的异步调用框架Async.Operation
Aug 04 Javascript
dropdownlist之间的互相联动实现(显示与隐藏)
Nov 24 Javascript
一个js导致的jquery失效问题的解决方法
Nov 27 Javascript
js实现在同一窗口浏览图片
Sep 17 Javascript
JavaScript人脸识别技术及脸部识别JavaScript类库Tracking.js
Sep 14 Javascript
第一章之初识Bootstrap
Apr 25 Javascript
jQuery制作网页版选项卡
Jul 28 Javascript
jQuery:unbind方法的使用详解
Aug 14 jQuery
Vue2.0系列之过滤器的使用
Mar 01 Javascript
JS通过位运算实现权限加解密
Aug 14 Javascript
微信小程序实现简易table表格
Jun 19 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操作文件的一些基本函数使用示例
2014/11/18 PHP
PHP生成图像验证码的方法小结(2种方法)
2016/07/18 PHP
JavaScript 字符串连接性能优化
2008/12/20 Javascript
javascript实现点击按钮弹出一个可关闭层窗口同时网页背景变灰的方法
2015/05/13 Javascript
JS 对象(Object)和字符串(String)互转方法
2016/05/20 Javascript
JS运动特效之完美运动框架实例分析
2018/01/24 Javascript
微信小程序wx.getImageInfo()如何获取图片信息
2018/01/26 Javascript
create-react-app构建项目慢的解决方法
2018/03/14 Javascript
vue+elementui 对话框取消 表单验证重置示例
2019/10/29 Javascript
Vue-cli3生成的Vue项目加载Mxgraph方法示例
2020/05/31 Javascript
js实现简易拖拽的示例
2020/10/26 Javascript
在vant中使用时间选择器和popup弹出层的操作
2020/11/04 Javascript
详解Python中的各种函数的使用
2015/05/24 Python
python字典DICT类型合并详解
2017/08/17 Python
Python WXPY实现微信监控报警功能的代码
2017/10/20 Python
Python实现图片转字符画的代码实例
2019/02/22 Python
Python Scrapy框架第一个入门程序示例
2020/02/05 Python
TensorFlow实现checkpoint文件转换为pb文件
2020/02/10 Python
Django中从mysql数据库中获取数据传到echarts方式
2020/04/07 Python
HTML5实现一个能够移动的小坦克示例代码
2013/09/02 HTML / CSS
美国著名童装品牌:OshKosh B’gosh
2016/08/05 全球购物
耐克巴西官方网站:Nike巴西
2016/08/14 全球购物
查找廉价航班和发现新目的地:Kiwi.com
2019/02/25 全球购物
马来西亚最大的在线隐形眼镜商店:MrLens
2019/03/27 全球购物
意大利一家专营包包和配饰的网上商店:Borse Last Minute
2019/08/26 全球购物
文明生主要事迹
2014/05/25 职场文书
诚实守信道德模范事迹材料
2014/08/15 职场文书
小学生放飞梦想演讲稿
2014/08/26 职场文书
公共艺术专业自荐信
2014/09/01 职场文书
工作作风建设心得体会
2014/10/22 职场文书
实训报告范文大全
2014/11/04 职场文书
销售2014年度工作总结
2014/12/08 职场文书
贫困证明书范文
2015/06/16 职场文书
解决redis sentinel 频繁主备切换的问题
2021/04/12 Redis
dubbo集成zipkin获取Traceid的实现
2021/07/26 Java/Android
CSS布局之浮动(float)和定位(position)属性的区别
2021/09/25 HTML / CSS