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 相关文章推荐
不错的asp中显示新闻的功能
Oct 13 Javascript
javascript入门·图片对象(无刷新变换图片)\滚动图像
Oct 01 Javascript
JavaScript关于select的相关操作说明
Jan 13 Javascript
使用jQuery全局事件ajaxStart为特定请求实现提示效果的代码
Dec 30 Javascript
javascript模拟订火车票和退票示例
Apr 24 Javascript
一个很有趣3D球状标签云兼容IE8
Aug 22 Javascript
把Node.js程序加入服务实现随机启动
Jun 25 Javascript
js基于setTimeout与setInterval实现多线程
Jun 17 Javascript
快速掌握jQuery插件开发
Jan 19 Javascript
快速解决vue在ios端下点击响应延时的问题
Aug 27 Javascript
Vue组件中的data必须是一个function的原因浅析
Sep 03 Javascript
turn.js异步加载实现翻书效果
Jul 25 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经典设计模式之依赖注入定义与用法详解
2019/05/21 PHP
通过复制Table生成word和excel的javascript代码
2014/01/20 Javascript
js识别不同浏览器基于userAgent做判断
2014/07/29 Javascript
Document.body.scrollTop的值总为零的快速解决办法
2016/06/09 Javascript
JS基于HTML5的canvas标签实现炫目的色相球动画效果实例
2016/08/24 Javascript
Vue 2.x教程之基础API
2017/03/06 Javascript
详解vue数据渲染出现闪烁问题
2017/06/29 Javascript
Angular.js中window.onload(),$(document).ready()的写法浅析
2017/09/28 Javascript
在 Node.js 中使用 async 函数的方法
2017/11/17 Javascript
微信小程序tabBar用法实例详解
2017/12/04 Javascript
json对象及数组键值的深度大小写转换问题详解
2018/03/30 Javascript
jQuery.extend 与 jQuery.fn.extend的用法及区别实例分析
2018/07/25 jQuery
原生js封装的ajax方法示例
2018/08/02 Javascript
iconfont的三种使用方式详解
2018/08/05 Javascript
layui 优化button按钮和弹出框的方法
2018/08/15 Javascript
浅谈react性能优化的方法
2018/09/05 Javascript
webstorm+vue初始化项目的方法
2018/10/18 Javascript
vue使用一些外部插件及样式的配置代码
2019/11/18 Javascript
vue实现移动端H5数字键盘组件使用详解
2020/08/25 Javascript
Vue实现圆环进度条的示例
2021/02/06 Vue.js
使用python获取CPU和内存信息的思路与实现(linux系统)
2014/01/03 Python
Python3如何解决字符编码问题详解
2017/04/23 Python
Python动态赋值的陷阱知识点总结
2019/03/17 Python
pandas DataFrame索引行列的实现
2019/06/04 Python
Python input函数使用实例解析
2019/11/22 Python
flask框架url与重定向操作实例详解
2020/01/25 Python
Pandas对DataFrame单列/多列进行运算(map, apply, transform, agg)
2020/06/14 Python
基于Python正确读取资源文件
2020/09/14 Python
python中字符串的编码与解码详析
2020/12/03 Python
详解如何在登录过期后跳出Ifram框架
2020/09/10 HTML / CSS
组织鉴定材料
2014/06/02 职场文书
社区综治工作汇报
2014/10/27 职场文书
2014年减负工作总结
2014/12/10 职场文书
安全员岗位职责
2015/02/10 职场文书
盘点2020年适合农村地区创业的项目
2019/10/16 职场文书
python flask开发的简单基金查询工具
2021/06/02 Python