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中的eval函数的更多相关文章
- JavaScript中的eval()函数
和其他很多解释性语言一样,JavaScript同样可以解释运行由JavaScript源代码组成的字符串,并产生一个值.JavaScript通过全局函数eval()来完成这个工作. eval(“1+2” ...
- JavaScript中的eval()函数详解
和其他很多解释性语言一样,JavaScript同样可以解释运行由JavaScript源代码组成的字符串,并产生一个值.JavaScript通过全局函数eval()来完成这个工作 eval(“1 ...
- javascript中的eval()函数应用以及要点
eval是干嘛用的?eval是直接将一段字符串作为参数,交给JS引擎预编译器进行动态分析并执行代码.如下: //调试台输出,你可以理解为console.log,再不理解就理解成alert也没事 var ...
- javascript中 关于eval的那些事
javascript中的eval是一个非常灵活,但是灵活是伴随着风险的. 一.下面我们来看看那使用eval声明变量的问题. function test(x){ eval("var a=x;& ...
- 借助JavaScript中的时间函数改变Html中Table边框的颜色
借助JavaScript中的时间函数改变Html中Table边框的颜色 <html> <head> <meta http-equiv="Content-Type ...
- 前端学习 第二弹: JavaScript中的一些函数与对象(1)
前端学习 第二弹: JavaScript中的一些函数与对象(1) 1.apply与call函数 每个函数都包含两个非继承而来的方法:apply()和call(). 他们的用途相同,都是在特定的作用域中 ...
- 理解和使用 JavaScript 中的回调函数
理解和使用 JavaScript 中的回调函数 标签: 回调函数指针js 2014-11-25 01:20 11506人阅读 评论(4) 收藏 举报 分类: JavaScript(4) 目录( ...
- JavaScript中变量和函数声明的提升
现象: 1.在JavaScript中变量和函数的声明会提升到最顶部执行. 2.函数的提升高于变量的提升. 3.函数内部如果用var声明了相同名称的外部变量,函数将不再向上寻找. 4.匿名函数不会提升. ...
- javascript中使用md5函数
javascript中使用md5函数 这对于js来讲本来是没有的,现在可以自己定义一个md5的函数,达到加密效果. var hexcase = 0; function hex_md5(a) { if ...
随机推荐
- Dynamics CRM 开启EmailRouter日志记录
找到mailrouter的安装路径,在service文件夹下找到"Microsoft.Crm.Tools.EmailAgent.xml"这个文件,已管理员方式打开,找到loglev ...
- 【一天一道LeetCode】#290. Word Pattern
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...
- Unity插件 - MeshEditor(五) 网格顶点动画(变形动画)
源码已上传至github,并持续更新,链接请看底部.(本帖跟随github持续更新) 网格顶点动画(变形动画)是针对于物体的形状可以随意变换并记录为关键帧的动画,虽然模型的顶点数据还是应该交给GPU绘 ...
- 开源项目——小Q聊天机器人V1.2
小Q聊天机器人V1.0 http://blog.csdn.net/baiyuliang2013/article/details/51386281 小Q聊天机器人V1.1 http://blog.csd ...
- How to Find the Self Service Related File Location and Versions
How to Find the Self Service Related File Location and Versions (文档 ID 781385.1) In this Document ...
- CentOS上PHP完全卸载
想把PHP卸载干净,直接用yum的remove命令是不行的,需要查看有多少rpm包,然后按照依赖顺序逐一卸载. 1.首先查看机器上安装的所有php相关的rpm包 [root@localhost ngi ...
- Windows Server2008R2、2012R2重置系统开机登陆密码
平时用的虚拟机太多导致经常会忘记密码,这里分享两个链接,分别对应的是08R2和12R2重置密码的方法. 08R2:http://ucweb.blog.51cto.com/4042188/962284 ...
- Cocos2D将v1.0的tileMap游戏转换到v3.4中一例(四)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 现在打开MainScene.m文件,首先设置实例变量: @imp ...
- 存储那些事儿(三):OpenStack的块存储Cinder与商业存储的融合
OpenStack是一个美国国家航空航天局和Rackspace合作研发的云端运算软件,以Apache许可证授权,并且是一个自由软件和开放源代码项目.OpenStack是IaaS(基础设施即服务)软 ...
- RabbitMQ消息队列(六):使用主题进行消息分发
在上篇文章RabbitMQ消息队列(五):Routing 消息路由 中,我们实现了一个简单的日志系统.Consumer可以监听不同severity的log.但是,这也是它之所以叫做简单日志系统的原因, ...