`
holdbelief
  • 浏览: 707971 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

转载:深入认识javascript中的eval函数

阅读更多
2007-5-21
                        分类:技术专区 时间:2007-5-21 15:04:58 作者:supNate
                        标签: eval    javascript   

发现为本文起一个合适的标题还不是那么容易,呵呵,所以在此先说明下本文的两个目的:
(1)介绍javascript中的eval 函数的用法
(2)如何在函数内执行全局代码

?先来说eval 的用法,内容比较简单,熟悉的可以跳过。
eval 函数接收一个参数s,如果s不是字符串,则直接返回s。否则执行s语句。如果s语句执行结果是一个值,则返回此值,否则返回undefined。
需要特别注意的是对象声明语法“{}”并不能返回一个值,需要用括号括起来才会返回值,简单示例如下:

可以看到,对于对象声明语句来说,仅仅是执行,并不能返回值。为了返回常用的“{}”这样的对象声明语句,必须用括号括住,以将其转换为表达式,才能返回其值。这也是使用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函数内可以访问到,外面就访问不到了。


而在实际的Ajax开发中,有时我们需要从服务器动态获取代码来执行,以减轻一次载入代码过多的问题,或者是一些代码是通过Javascript自身生成的,希望用eval 函数来使其执行。
但这样的动态获取代码的工作一般在函数内完成,比如:

function loadCode(){
    var code =getCode();
    eval (code );
}

可见eval 不可能在全局空间内执行,这就给开发带来了不少问题,也看到过很多人为此郁闷。

不过现在偶终于找到了解决办法,嘿嘿,可以同时兼容IE和Firefox,方法如下:

var X2={}    //my namespace:)
X2.Eval =function(code ){
 if(!!(window.attachEvent && !window.opera)){
  //ie
  execScript(code ); 
 }else{
  //not ie
  window.eval (code );
 }
}

现在如果要想在函数内定义全局代码,就可以通过调用X2.Eval (code )方法,一个例子如下:

var s='global';
function demo3(){
 X2.Eval ('var s="local"');
}
demo3();
alert(s); //->'local'

可见,在demo3函数内重新定义了全局变量s="local"。
需要注意的是X2.Eval 并不返回值,如果要进行表达式的求值,还是用系统的eval 函数。X2.Eval 设计为仅做全局代码定义用。

其实看到这里,或许有人感觉问题也太容易解决了点,呵呵,但发现这个办法倒是需要些运气和技巧的:
(1)对于IE浏览器,默认已经提供了这样的函数:execScript,用于在全局空间执行代码,只是知道的人还不多。
(2)对于Firefox浏览器,直接调用eval 函数,则在调用者的空间执行;如果调用window.eval 则在全局空间执行。这个知道的人估计就更少了。毕竟alert(eval ==window.eval )返回true!

Firefox的eval 函数的特点的确是很令人奇怪的,但从javascript规范中倒也能找到其来源:

If value of the eval property is used in any way other than a direct call (that is, other than by the explicit use of its
name as an Identifier which is the MemberExpression in a CallExpression), or if the eval property is assigned to,
an EvalError exception may be thrown.

意思大概就是说eval 函数的执行是和调用者相关的,但并没有说其执行上下文的问题。所以IE和Firefox孰是孰非也就很难说了,大家知道解决办法就好。

分享到:
评论
2 楼 holdbelief 2009-11-30  
谢谢
1 楼 aystnd 2009-11-02  
if(window.execScript) {
    window.execScript(code);
} else {
    window.eval(code);
}

这样写更好一些

相关推荐

    深入认识javascript中得eval函数

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

    Javascript中eval函数的用法

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

    javascript中eval函数用法分析.docx

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

    在Javascript中Eval函数的使用?

    JavaScript中的`eval()`函数是一个非常特殊且功能强大的工具,它能够执行一个字符串作为JavaScript代码。这个函数在很多情况下被用于动态地编译和运行代码,但同时也因为其潜在的安全风险和性能问题而备受争议。在...

    javascript 自定义eval函数实现

    在本讨论中,我们将深入探讨如何自定义`eval()`函数以提高代码的安全性和效率,同时也会涉及到JavaScript的动态执行特性以及其在实际开发中的应用。 首先,`eval()`的默认行为是将其接收到的字符串当作JavaScript...

    在Javascript中Eval函数的使用.doc

    假设用户选择了一项操作,我们可以将选择转化为字符串,然后用`eval()`来执行相应的函数: ```javascript var userAction = "swapImage"; if (typeof window[userAction] === 'function') { window[userAction]()...

    javascript中eval函数用法分析

    本文实例分析了javascript中eval函数用法。分享给大家供大家参考。具体分析如下: eval()只有一个参数,如果传入的参数不是字符串,则直接返回这个参数。否则会将字符串当成js代码进行编译,如果编译失败则...

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

    最后,关于文档`javascript执行eval函数时利用正则表达式去掉回车符换行符和注释.doc`,这可能是详细阐述这一过程的文档,包含了具体实现和可能遇到的问题的解决方案。阅读此文档将有助于深入理解如何实际应用这些...

    深入认识javascript中的eval函数

    在JavaScript中,eval函数是一个内置的对象,主要用于执行一个字符串表达式,并返回表达式的值。eval函数的使用需要谨慎,因为它会执行一段字符串中的JavaScript代码,并且这种执行方式可能会带来安全问题。 1. ...

    java实现eval函数

    然而,如果你提供的压缩包"java实现eval函数"包含的是一个Java项目,那么它很可能是实现了类似功能的自定义解决方案,可能是一个解析器或者编译器,用于处理特定的表达式或脚本语法。这个项目可能包括以下几个部分:...

    eval函数的一些用法

    2. 使用`new Function()`构造函数:与`eval()`类似,但只接受一组参数和一个包含代码的字符串。 3. JSON.parse():对于JSON数据,始终优先使用这个安全的方法。 总结,`eval()`函数虽然强大,但也极具风险。理解和...

    Javascript中eval函数的详细用法与说明

    * 动态创建函数:使用 eval 函数可以根据用户的输入直接创建函数,这使得程序可以根据时间或用户输入的不同而发生变化。 * 获取难以索引的对象:eval 函数可以用来获取难以索引的对象,例如文档对象模型(DOM)中的...

    javascript实现根据函数名称字符串动态执行函数的方法示例

    1. 使用eval()函数: eval()函数可以执行字符串中的JavaScript代码,如果我们知道要调用的函数名的字符串,可以将其与括号“()”组合起来形成代码字符串,并用eval()函数执行。示例代码如下: ```javascript ...

    javascript_函数大全

    在深入探讨JavaScript函数的广泛应用与特性之前,让我们首先明确一点:JavaScript函数不仅是编程语言中的核心组件,更是实现复杂逻辑、封装功能模块的关键所在。不同于许多传统面向对象的语言,JavaScript通过其独特...

    javascript eval函数深入认识

    `eval` 函数虽然强大,但也非常危险,因为它允许字符串中的任何 JavaScript 代码被执行。在大多数情况下,使用 `eval` 应谨慎考虑替代方案,如使用 `JSON.parse` 处理 JSON 数据,或者利用函数构造器来动态创建函数...

    JavaScript中eval函数的问题

    今天看代码,遇到一个eval函数的问题,到现在翻了很多博文,还是不是很懂eval函数,有个一直没法理解的代码如下: /* var start = [] , end = [] , timings = []; */ function f(){ //模拟程序执行时间 var sum ...

    Javascript中Eval函数的使用说明

    JavaScript中的`eval()`函数是一个非常强大的工具,它可以将接收到的字符串当作JavaScript代码来执行。这个功能使得动态编程成为可能,允许程序根据运行时的条件或用户输入来改变其行为。然而,`eval()`的使用也需要...

Global site tag (gtag.js) - Google Analytics