`

(转)javascript的eval

 
阅读更多
1 EVAL基本用法:
   函数接收一个参数s,如果s不是字符串,则直接返回s。否则执行s语句。如果s语句执行结果是一个值,则返回此值,否则返回undefined。
需要特别注意的是对象声明语法“{}”并不能返回一个值,需要用括号括起来才会返回值,简单示例如下:
var code1='"a" + 2';    //表达式
var code2='{a:2}';      //语句
alert(eval(code1));     //->'a2'
alert(eval(code2));     //->undefined
alert(eval('(' + code2 + ')'));    //->[object Object]
        可以看到,对于对象声明语句来说,仅仅是执行,并不能返回值。为了返回常用的“{}”这样的对象声明语句,必须用括号括住,以将其转换为表达式,才能返回其值。这也是使用JSON来进行Ajax开发的基本原理之一。在例子中可以清楚的看到,第二个alert语句输出的是undefined,而第三个加了括号后输出的是语句表示的对象。
            ►现在来说本文的重点,如何在函数内执行全局代码。为了说明这个问题,先看一个例子:
var s='global';    //定义一个全局变量
function demo1(){
    eval('var s="local"');
}
demo1();
alert(s);    //->global
         很好理解,上面的demo1函数等价于:function demo1(){var s='local';},其中定义了一个局部变量s。
        所以最后的输出是global并不是什么奇怪的事情,毕竟大家都能很清楚的区分局部变量和全局变量。
        仔细体会一下,可以发现eval函数的特点,它总是在调用它的上下文变量空间(也称为:包,closure)内执行,无论是变量定义还是函数定义都是如此,所以如下的代码会产生函数未定义的错误:
var s='function test(){return 1;}';     //一个函数定义语句
function demo2(){
    eval(s);
}
demo2();
alert(test());    //->error:test is not defined
        这是因为test函数在局部空间定义,demo2函数内可以访问到,外面就访问不到了。



2 效率问题:
    Simon Willison 认为:虽然Javascript提供了把动态字符串作为脚本代码来执行的 eval() 函数,为代码的编写提供了很多的便利,但同时也导致了代码执行效率的低下以及难以维护。通常来说,只有设计存在缺陷才会不得不用 eval() 来弥补这些缺陷。



     对于 eval() 的使用最常见的错误是用来动态获取某个对象/子对象及其属性。假设你的代码中有一个对象foo,其属性将在运行时被决定。你可能会想用eval来解决这个问题:



1.       var property = 'bar';  

2.        

3.       var value = eval('foo.' + property);  

4.        

    

     这样做固然可以达到预期的效果,但这会导致JavaScript每次运行这段代码的时候都切换到解释器模式来重新解释这段动态构建的代码,其运行效率大大降低。实际上以上情况你可以完全回避使用eval():



1.       var property = 'bar';  

2.        

3.       var value = foo[property];  

4.        



     另一方面,使用 eval() 也可能会导致一些潜在的安全隐患。这一点对于任何语言来说都是如此。当你通过页面的GET/POST参数来获取数据并 eval() 之的时候,就有可能被恶意用户利用来注入非法代码进行非预期的操作。所以,无论是从执行效率、代码维护成本还是应用安全性角度考虑,对于 eval() 的使用都必须谨慎。回想自己曾经写过的那些代码,有段时间里面 eval() 简直被我给用滥了 -- 最直接的后果就是给接手的其他程序员造成了不小的麻烦。要弄懂一段动态组合出来的字符串到底被 eval() 之后是用来干什么的的确不像结构清晰的OO代码那么容易。

  结论:有“eval”的代码比没有“eval”的代码要慢上 100 倍以上。

主要原因是:JavaScript 代码在执行前会进行类似“预编译”的操作:首先会创建一个当前执行环境下的活动对象,并将那些用 var 申明的变量设置为活动对象的属性,但是此时这些变量的赋值都是 undefined,并将那些以 function 定义的函数也添加为活动对象的属性,而且它们的值正是函数的定义。但是,如果你使用了“eval”,则“eval”中的代码(实际上为字符串)无法预先识别其上下文,无法被提前解析和优化,即无法进行预编译的操作。所以,其性能也会大幅度降低。

分享到:
评论

相关推荐

    javascript eval和JSON

    ### JavaScript中的`eval`函数与JSON的理解与应用 #### `eval`函数的工作原理及应用场景 在JavaScript编程语言中,`eval`是一个全局函数,它的主要功能是接收一个字符串参数,该字符串应该包含有效的JavaScript...

    在Javascript中Eval函数的使用?

    在大多数情况下,开发者应该避免或谨慎使用`eval()`,转而寻求更安全、更高效的方法来实现相同的功能。对于初学者来说,理解`eval()`的工作原理以及其潜在风险是十分重要的,这样在面对具体场景时才能做出明智的选择...

    Javascript中eval函数的用法

    JavaScript 中 eval 函数的用法 JavaScript 中的 eval 函数是一个非常强大且灵活的函数,可以将一个字符串当作一个 JavaScript 表达式来执行。正如我们在上面的描述中所看到的,eval 函数可以将一个字符串解释成 ...

    JavaScript Eval 在线加密/解密工具 v0.1

    专门解码解密eval(function(p,a,c,k,e,r){})、eval(function(p,a,c,k,e,d)...{})等多种eval编码加密的Javascript源代码.暂不支持语法高亮.不支持低版本IE.P.S:该程序是仿制的,非原创!

    javascript 自定义eval函数实现

    JavaScript中的`eval()`函数是一个非常强大但又颇具争议的功能,它允许执行一个字符串作为JavaScript代码。在本讨论中,我们将深入探讨如何自定义`eval()`函数以提高代码的安全性和效率,同时也会涉及到JavaScript的...

    基于PHP的JavaScript Eval 在线加密解密工具 php版.zip

    2. **JavaScript `eval()`函数**:`eval()`在JavaScript中扮演着动态执行代码的角色。在加密解密工具中,它被用来在前端解密已加密的代码并执行。由于`eval()`的安全隐患,这个工具的目的是在提供代码安全性的同时,...

    PHP实例开发源码-JavaScript Eval 在线加密解密工具 php版.zip

    PHP实例开发源码—JavaScript Eval 在线加密解密工具 php版.zip PHP实例开发源码—JavaScript Eval 在线加密解密工具 php版.zip PHP实例开发源码—JavaScript Eval 在线加密解密工具 php版.zip

    javascript eval() 实现简单的计算器

    就一个简简单单的,用javascript做的,加上eval()函数搞的,主要就是对eval()的使用,界面可以自己再设计。

    在Javascript中Eval函数的使用.doc

    在JavaScript中,`eval()`函数是一个极具争议但又非常有用的工具。它允许我们将字符串作为JavaScript代码来执行,这在某些特定场景下提供了极大的灵活性。然而,这种灵活性也带来了安全风险和性能问题,因此在实际...

    javascript执行eval函数时利用正则表达式去掉回车符换行符和注释

    JavaScript中的`eval()`函数是一个非常强大的工具,它能够将字符串作为JavaScript代码来执行。然而,直接使用`eval()`可能存在安全风险,比如代码注入攻击。在某些特定场景下,我们需要对输入的字符串进行预处理,...

    PHP实例开发源码—JavaScript Eval 在线加密解密工具 php版.zip

    其中,JavaScript `eval` 函数是关键,它能够执行一个字符串作为JavaScript代码。这个工具可能是为了帮助开发者在传输或存储JavaScript代码时增加安全性,通过加密来防止代码被窃取或篡改。 【描述解析】 描述中的...

    深入认识javascript中得eval函数

    ### 深入认识JavaScript中的eval函数 #### 一、eval函数概述 在JavaScript中,`eval`函数是一个内置函数,它可以将字符串形式的代码解析并执行。这为开发者提供了一种灵活的方式来动态生成和执行代码。然而,由于...

    json------javascript eval()以及Example

    本文将深入探讨JSON与JavaScript中的`eval()`函数的关系,并通过一个具体的示例来展示它们如何协同工作。 在JavaScript中,`eval()`函数是一个危险但强大的工具,它可以执行一个字符串作为JavaScript代码。在处理...

    javascript中eval解析JSON字符串.docx

    ### JavaScript中eval解析JSON字符串详解 #### 一、前言 在JavaScript开发中,解析JSON字符串是一项常见的任务。其中一种方法是使用`eval()`函数。虽然这种方法并不推荐,但了解其工作原理及其潜在风险仍然非常...

    javascript中eval函数用法分析.docx

    ### JavaScript中eval函数用法分析 #### 一、eval函数简介 `eval()`函数是JavaScript中的内置函数之一,用于解析并执行包含JavaScript代码的字符串。它只有一个参数,该参数可以是字符串或非字符串类型。 - **非...

    javascript中eval和with用法实例总结.docx

    ### JavaScript中的`eval`与`with`用法详解 #### 一、`eval`函数 ##### 1. 定义 `eval`是JavaScript中一个非常强大的内置函数,它可以将字符串解析并执行为JavaScript代码。这使得开发者能够在运行时动态地创建和...

    eval 加密和解密

    在JavaScript中,`eval`通常用于处理JSON对象,因为JSON.stringify()方法会将JavaScript对象转换成一个JSON格式的字符串,而JSON.parse()则能将这个字符串解析回JavaScript对象。但出于安全考虑,直接使用`eval`解析...

    javascript eval()应用实例 select

    JavaScript的`eval()`函数是一个非常强大但又颇具争议的功能,它允许我们将字符串作为代码来执行。在本实例中,`eval()`被用于处理一组复选框(checkboxes)的选择状态,以便于跟踪用户的选择。 首先,我们创建了一...

    java实现js中eval功能

    在JavaScript中,`eval()`函数是一个非常特殊且强大的工具,它能够将字符串作为JavaScript代码执行。这个功能在处理动态生成的代码或者解析JSON时非常有用。然而,由于安全和性能问题,`eval()`通常被避免在生产环境...

    java实现eval函数

    在Java编程语言中,`eval`函数通常与JavaScript关联,因为JavaScript有一个内置的`eval`函数,它能够解析并执行一个字符串作为JavaScript代码。然而,Java本身并不直接提供类似的功能。`eval`函数在Java中并不是标准...

Global site tag (gtag.js) - Google Analytics