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函数的更多相关文章

  1. JavaScript中的eval()函数

    和其他很多解释性语言一样,JavaScript同样可以解释运行由JavaScript源代码组成的字符串,并产生一个值.JavaScript通过全局函数eval()来完成这个工作. eval(“1+2” ...

  2. JavaScript中的eval()函数详解

    和其他很多解释性语言一样,JavaScript同样可以解释运行由JavaScript源代码组成的字符串,并产生一个值.JavaScript通过全局函数eval()来完成这个工作     eval(“1 ...

  3. javascript中的eval()函数应用以及要点

    eval是干嘛用的?eval是直接将一段字符串作为参数,交给JS引擎预编译器进行动态分析并执行代码.如下: //调试台输出,你可以理解为console.log,再不理解就理解成alert也没事 var ...

  4. javascript中 关于eval的那些事

    javascript中的eval是一个非常灵活,但是灵活是伴随着风险的. 一.下面我们来看看那使用eval声明变量的问题. function test(x){ eval("var a=x;& ...

  5. 借助JavaScript中的时间函数改变Html中Table边框的颜色

    借助JavaScript中的时间函数改变Html中Table边框的颜色 <html> <head> <meta http-equiv="Content-Type ...

  6. 前端学习 第二弹: JavaScript中的一些函数与对象(1)

    前端学习 第二弹: JavaScript中的一些函数与对象(1) 1.apply与call函数 每个函数都包含两个非继承而来的方法:apply()和call(). 他们的用途相同,都是在特定的作用域中 ...

  7. 理解和使用 JavaScript 中的回调函数

    理解和使用 JavaScript 中的回调函数 标签: 回调函数指针js 2014-11-25 01:20 11506人阅读 评论(4) 收藏 举报  分类: JavaScript(4)    目录( ...

  8. JavaScript中变量和函数声明的提升

    现象: 1.在JavaScript中变量和函数的声明会提升到最顶部执行. 2.函数的提升高于变量的提升. 3.函数内部如果用var声明了相同名称的外部变量,函数将不再向上寻找. 4.匿名函数不会提升. ...

  9. javascript中使用md5函数

    javascript中使用md5函数 这对于js来讲本来是没有的,现在可以自己定义一个md5的函数,达到加密效果. var hexcase = 0; function hex_md5(a) { if ...

随机推荐

  1. Eclipse编写ExtJS卡死问题 eclise js验证取消

    1. Eclipse编写ExtJS卡死问题 eclise js验证取消 近期项目用到了extjs,发现项目编译的时候特别的卡,浪费很多时间而且保存的时候还要编译,因此打算看下如何取消验证extjs.最 ...

  2. JAVA之旅(三十四)——自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫

    JAVA之旅(三十四)--自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫 我们接着来说网络编程,TCP 一.自定义服务端 我们直接写一个服务端,让本机去连接 ...

  3. android view事件分发机制

    首先我们先写个简单的例子来测试View的事件转发的流程~ 1.案例 为了更好的研究View的事件转发,我们自定以一个MyButton继承Button,然后把跟事件传播有关的方法进行复写,然后添加上日志 ...

  4. T-SQL 中的CROSS JOIN用法(半翻译)

    突然发现个很吊的链接,我们来看看学习数据库要做些什么,胆小慎点:DBA工作内容!!!! 今天来翻译一篇关于T-SQL的文章,本文可供微软认证70-461:QueryingMicrosoft SQL S ...

  5. jar包执行报ClassNotFoundException

    使用Eclipse打包jar包,指定了main class. java -jar mongoCluster.jar 但是运行的时候报ClassNotFoundException NoClassDefF ...

  6. java设计模式---访问者模式

      Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自 己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广 泛,遵循一定的编程模式,才能使自 ...

  7. Hadoop-1.0.4伪分布安装与配置

    1.采用伪分布模式安装      将hadoop-****.tar.gz复制到linux的/usr/local目录下. 2.解压,重命名      #tar -xzvf hadoop-1.0.4.ta ...

  8. 【一天一道LeetCode】#86. Partition List

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...

  9. STL:map/multimap用法详解

    map/multimap 使用map/multimap之前要加入头文件#include<map>,map和multimap将key/value当作元素,进行管理.它们可根据key的排序准则 ...

  10. 海量数据挖掘MMDS week3:社交网络之社区检测:高级技巧

    http://blog.csdn.net/pipisorry/article/details/49052255 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...