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 相关文章推荐
有效的捕获JavaScript焦点的方法小结
Oct 08 Javascript
莱鸟介绍window.print()方法
Jan 06 Javascript
利用js+css+html实现固定table的列头不动
Dec 08 Javascript
如何提高Dom访问速度
Jan 05 Javascript
Angular多选、全选、批量选择操作实例代码
Mar 10 Javascript
详解如何用webpack打包一个网站应用项目
Jul 12 Javascript
web前端开发中常见的多列布局解决方案整理(一定要看)
Oct 15 Javascript
gulp安装以及打包合并的方法教程
Nov 19 Javascript
浅谈vux之x-input使用以及源码解读
Nov 04 Javascript
使用layui定义一个模块并使用的例子
Sep 14 Javascript
javascript实现摄像头拍照预览
Sep 30 Javascript
JS实现的雪花飘落特效示例
Dec 03 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
《被神捡到的男人》动画化计划进行中!
2020/03/06 日漫
我的论坛源代码(二)
2006/10/09 PHP
php cookie 登录验证示例代码
2009/03/16 PHP
PHP form 表单传参明细研究
2009/07/17 PHP
php中将地址生成迅雷快车旋风链接的代码[测试通过]
2011/04/20 PHP
PHP防盗链代码实例
2014/08/27 PHP
PHP 构造函数和析构函数原理与用法分析
2020/04/21 PHP
PHP获取真实IP及IP模拟方法解析
2020/11/24 PHP
js跟随滚动条滚动浮动代码
2009/12/31 Javascript
Javascript中获取出错代码所在文件及行数的代码
2010/09/23 Javascript
谈谈JavaScript中的函数与闭包
2013/04/14 Javascript
使用Chart.js图表库制作漂亮的响应式表单
2015/10/28 Javascript
js学习总结之dom2级事件基础知识详解
2017/07/27 Javascript
jquery引入外部CDN 加载失败则引入本地jq库
2018/05/23 jQuery
详解vue挂载到dom上会发生什么
2019/01/20 Javascript
vue绑定class的三种方法
2020/12/24 Vue.js
[44:39]2014 DOTA2国际邀请赛中国区预选赛 NE VS CNB
2014/05/21 DOTA
Python 深入理解yield
2008/09/06 Python
python算法表示概念扫盲教程
2017/04/13 Python
Python实现求笛卡尔乘积的方法
2017/09/16 Python
Python面向对象程序设计之继承与多继承用法分析
2018/07/13 Python
Django如何防止定时任务并发浅析
2019/05/14 Python
python3 自动打印出最新版本执行的mysql2redis实例
2020/04/09 Python
Python基于pandas爬取网页表格数据
2020/05/11 Python
keras 实现轻量级网络ShuffleNet教程
2020/06/19 Python
KIKO MILANO俄罗斯官网:意大利领先的化妆品和护肤品品牌
2021/01/09 全球购物
对象的序列化(serialization)类是面向流的,应如何将对象写入到随机存取文件中
2015/06/22 面试题
汽车驾驶求职信
2013/10/25 职场文书
机电专业毕业生求职信
2013/10/27 职场文书
教师远程培训感言
2014/03/06 职场文书
音乐节策划方案
2014/06/09 职场文书
2015新员工试用期工作总结
2014/12/12 职场文书
小英雄雨来观后感
2015/06/09 职场文书
读《推着妈妈去旅行》有感1500字
2019/10/15 职场文书
详解MySQL连接挂死的原因
2021/05/18 MySQL
使用CSS定位HTML元素的实现方法
2022/07/07 HTML / CSS