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 相关文章推荐
jQuery基于cookie实现的购物车实例分析
Dec 24 Javascript
jQuery实现区域打印功能代码详解
Jun 17 Javascript
jQuery和hwSlider实现内容响应式可触控滑动切换效果附源码下载(二)
Jun 22 Javascript
解决Node.js使用MySQL出现connect ECONNREFUSED 127.0.0.1:3306的问题
Mar 09 Javascript
jQuery实现frame之间互通的方法
Jun 26 jQuery
Vue实例中生命周期created和mounted的区别详解
Aug 25 Javascript
MVVM框架下实现分页功能示例
Jun 14 Javascript
mpvue 页面预加载新增preLoad生命周期的两种方式
Oct 17 Javascript
JS实现随机抽选获奖者
Nov 07 Javascript
JS实现进度条动态加载特效
Mar 25 Javascript
JS字符串和数组如何实现相互转化
Jul 02 Javascript
node.js使用express-fileupload中间件实现文件上传
Jul 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
如何分别全角和半角以避免乱码
2006/10/09 PHP
PHP CURL模拟GET及POST函数代码
2010/04/25 PHP
jQuery+PHP发布的内容进行无刷新分页(Fckeditor)
2015/10/22 PHP
php获取数据库结果集方法(推荐)
2017/06/01 PHP
Laravel5.4框架中视图共享数据的方法详解
2019/09/05 PHP
漂亮的仿flash菜单,来自蓝色经典
2006/06/26 Javascript
javascript jQuery插件练习
2008/12/24 Javascript
IE8对JS通过属性和数组遍历解析不一样的地方探讨
2013/05/06 Javascript
JavaScript实现弹出DIV层同时页面背景渐变成半透明效果
2016/03/25 Javascript
基于JQuery打造无缝滚动新闻步骤详解
2016/03/31 Javascript
jQuery实现的无缝广告图片左右滚动功能详解
2016/12/24 Javascript
从零开始学习Node.js系列教程之SQLite3和MongoDB用法分析
2017/04/13 Javascript
微信小程序实现image组件图片自适应宽度比例显示的方法
2018/01/16 Javascript
详解Vue中watch对象内属性的方法
2019/02/01 Javascript
JavaScript:ES2019 的新特性(译)
2019/08/08 Javascript
package.json中homepage属性的作用详解
2020/03/11 Javascript
Vue Object 的变化侦测实现代码
2020/04/15 Javascript
Element Alert警告的具体使用方法
2020/07/27 Javascript
js实现盒子移动动画效果
2020/08/09 Javascript
JS实现简易日历效果
2021/01/25 Javascript
[02:40]2014DOTA2 国际邀请赛中国区预选赛 四大豪门抵达华西村
2014/05/23 DOTA
[03:55]TI9战队采访——TNC Predator
2019/08/22 DOTA
在java中如何定义一个抽象属性示例详解
2017/08/18 Python
Python多重继承的方法解析执行顺序实例分析
2018/05/26 Python
一百多行python代码实现抢票助手
2018/09/25 Python
pygame游戏之旅 调用按钮实现游戏开始功能
2018/11/21 Python
python实现按行分割文件
2019/07/22 Python
Python基于pandas爬取网页表格数据
2020/05/11 Python
Invicta手表官方商店:百年制表历史的瑞士腕表品牌
2019/09/26 全球购物
华为c/c++笔试题
2016/01/25 面试题
销售人员求职的自我评价分享
2014/03/15 职场文书
工作疏忽、懈怠的检讨书
2014/09/11 职场文书
店铺转让协议书(2014版)
2014/09/23 职场文书
开国大典观后感
2015/06/04 职场文书
嘉年华活动新闻稿
2015/07/17 职场文书
Vue OpenLayer测距功能的实现
2022/04/20 Vue.js