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 相关文章推荐
破解Session cookie的方法
Jul 28 Javascript
彪哥1.1(智能表格)提供下载
Sep 07 Javascript
一个背景云变换js特效 鼠标移动背景云变化
Dec 28 Javascript
jQuery获取Select选择的Text和Value(详细汇总)
Jan 25 Javascript
javascript中的遍历for in 以及with的用法
Dec 22 Javascript
jQuery+CSS3实现树叶飘落特效
Feb 01 Javascript
网页禁用右键菜单和鼠标拖动选择方法小结
Feb 25 Javascript
再谈JavaScript异步编程
Jan 27 Javascript
BootStrap3中模态对话框的使用
Jan 06 Javascript
vue.js声明式渲染和条件与循环基础知识
Jul 31 Javascript
JavaScript 完成注册页面表单校验的实例
Aug 19 Javascript
vue使用showdown并实现代码区域高亮的示例代码
Oct 17 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 配置open_basedir 让各虚拟站点独立运行
2009/11/12 PHP
PHP 读取文件内容代码(txt,js等)
2009/12/06 PHP
phpmyadmin导入(import)文件限制的解决办法
2009/12/11 PHP
学习php设计模式 php实现命令模式(command)
2015/12/08 PHP
PHP7基于curl实现的上传图片功能
2018/05/11 PHP
Laravel 实现关系模型取出需要的字段
2019/10/10 PHP
css动画效果之animation的常用样式
2021/03/09 HTML / CSS
js 获取浏览器高度和宽度值(多浏览器)
2009/09/02 Javascript
巧用jquery解决下拉菜单被Div遮挡的相关问题
2014/02/13 Javascript
Jquery 返回json数据在IE浏览器中提示下载的问题
2014/05/18 Javascript
JavaScript获取一个范围内日期的方法
2015/04/24 Javascript
简单介绍JavaScript中字符串创建的基本方法
2015/07/07 Javascript
jquery编写日期选择器
2017/03/16 Javascript
jquery ajaxfileupload异步上传插件
2017/11/21 jQuery
详解vue-cli中模拟数据的两种方法
2018/07/03 Javascript
解决vue 界面在苹果手机上滑动点击事件等卡顿问题
2018/11/27 Javascript
layui实现checkbox的目录树tree的例子
2019/09/12 Javascript
Javascript 类型转换、封闭函数及常见内置对象操作示例
2019/11/15 Javascript
python基于ID3思想的决策树
2018/01/03 Python
python 常用的基础函数
2018/07/10 Python
解决django服务器重启端口被占用的问题
2019/07/26 Python
Python3 集合set入门基础
2020/02/10 Python
CSS3实现简易版的刮刮乐效果
2016/09/27 HTML / CSS
css3制作彩色边线3d立体按钮的示例(css3按钮)
2014/05/06 HTML / CSS
Canvas多边形绘制的实现方法
2019/08/05 HTML / CSS
英国时尚女装购物网站:Missguided
2018/08/23 全球购物
法国春天百货官网:Printemps.com
2020/06/29 全球购物
opencv实现图像几何变换
2021/03/24 Python
市优秀教师事迹材料
2014/02/05 职场文书
生产部厂长职位说明书
2014/03/03 职场文书
超市创意活动方案
2014/08/15 职场文书
2014年宣传部工作总结
2014/11/12 职场文书
乡镇科协工作总结2015
2015/05/19 职场文书
盗窃罪辩护词范文
2015/05/21 职场文书
二审答辩状范文
2015/05/22 职场文书
原来闭幕词是这样写的呀!
2019/07/01 职场文书