`
caii
  • 浏览: 6344 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

eval 的那些事儿~~

阅读更多
买了 [JavaScript语言精髓与编程实践],这几天天天在看….
也看了书的作者的BLOG,具体帖子:
http://blog.csdn.net/aimingoo/archive/2008/07/22/2692512.aspx

以下谈谈针对上帖的学习感受..


“声明语句”是不返回值的
对这句话的理解非常关键,否则看帖子会完全没有思路,完全不必要再看下去。
首先什么事 声明语句?
在JSCRIPT手册上 对于var有这样的解释 :
[var 语句
声明变量。]

var a=100;
var t={};
var u=[1,2,3];
这些都是声明语句。声明语句是在语法解释期,由预编译器处理的,比如
alert(n);
var n=10;
这在浏览器中会显示出“undefined”,而不是报错。原因还是因为“声明语句是在语法解释期,由预编译器处理的”,所以执行语句的时候,尽管在代码的物理位置上,var n在alert(n)的上面。但是还是会知道已经声明了n.
这和赋值语句是不一样的。
赋值语句  n=10;这种语句只会在执行期执行。而不会预先声明。有返回值,为最右边的10

对于function x() {}
称为具名函数的“声明语句”。
所以:
var func = eval("function u(){}");
var func = eval("var c=100");
都返回 undefined;

但是   如果是 var func = eval("(function u(){})"); 
在引号后面加上了()后,情况就变得有些“显得复杂了“。

括号()有运算符的意思。表示强制优先运算。比如5+7*10   与(5+7)*12。
所以加了括号之后,就成了表达式了。而非声明语句。
因为 “eval()的返回值,其实是语句最后一个(有效的)子句的返回值。“
所以加了括号之后,成了一个函数表达式。总之不是一个声明语句(函数声明)。所以浏览器[FIREFOX]显示为function u() {} ;
但是在以JSCRIPT为核心的IE中,情况却并非这样。
IE中还是认为这是一个函数声明。事实上IE确实把u被声明了,而在FF里没有声明(不可能在“表达式”中出现“语句声明”) ,所以在IE中任然显示undefined.

而在帖子的末尾, 说是在括号里加上运算符就真正的是语句了。
var func = eval("(1, function(){})");
alert(func);  // 显示"function(){}"  在这里又是表达式,又是声明语句。

总结起来:

声明语句”是不返回值的,也就是返回undefined
eval()的返回值,其实是语句最后一个(有效的)子句的返回值。

其实这种技术很可能没有一点用处,但是用来锻炼分析问题的能力也还是不错的,同时也告诉自己尽量避免简单的事情做得复杂不可预见。



分享到:
评论

相关推荐

    ide-eval-resetter-2.3.5.zip

    ide-eval-resetter-2.3.5-c80a1d.zipide-eval-resetter-2.3.5-c80a1d.zipide-eval-resetter-2.3.5-c80a1d.zipide-eval-resetter-2.3.5-c80a1d.zipide-eval-resetter-2.3.5-c80a1d.zipide-eval-resetter-2.3.5-c80a1d...

    eval 加密和解密

    在这里,我们将深入探讨eval函数在加密和解密中的应用,以及相关工具的使用。 首先,`eval`是一个在许多动态语言中都存在的函数,如JavaScript和PHP,它的主要功能是将字符串当作可执行的代码来运行。在加密和解密...

    eval解密脚本 eval解密脚本 eval解密脚本

    eval解密脚本FLASH eval解密脚本 eval解密脚本

    java实现js中eval功能

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

    java实现eval函数

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

    前端项目-expr-eval.zip

    《前端项目-expr-eval:数学表达式求值器的深度解析》 在现代Web开发中,前端项目扮演着至关重要的角色,它们是用户与应用程序交互的直接界面。本篇文章将深入探讨一个名为"expr-eval"的前端项目,这是一个用于解析...

    EVAL操作集合 包含Eval()的一些常用操作 常用函数

    EVAL操作集合包含Eval()的一些常用操作常用函数 EVAL操作是ASP.NET中的一种绑定机制,可以将数据绑定到控件上,以便在页面上显示数据。Eval操作可以计算字符串,并绑定字段等功能。 在使用Eval操作时,需要注意...

    ide-eval-resetter-2.1.14.zip

    IDE Eval Resetter 2.1.14 是...总结起来,IDE Eval Resetter 2.1.14 是一个用于重置集成开发环境试用期的工具,适用于那些需要延长IDE使用时间的开发者。然而,使用此类工具需谨慎,应遵循合法和道德的软件使用原则。

    trec_eval_latest.tar

    《TREC评估工具trec_eval最新版本解析》 在信息技术领域,信息检索(Information Retrieval, IR)是一项至关重要的任务,而TREC(Text REtrieval Conference)是推动这一领域发展的重要活动。作为IR评估的标准工具...

    ide-eval-resetter

    总的来说,ide-eval-resetter是一个帮助开发者延长IDE试用期的工具,适用于那些需要长时间使用但暂时无法购买许可证的情况。然而,用户在使用时需谨慎,确保其行为符合软件的许可条款,以免引起法律纠纷。同时,我们...

    ide eval resetter V2.1.13

    ide eval resetter V2.1.13

    DataBinder.Eval总结

    DataBinder.Eval 是ASP.NET中用于数据绑定的一个非常重要的方法,它允许我们在ASP.NET Web表单中动态地从数据源获取并显示数据。这个方法主要用在控件的数据绑定表达式中,比如在Repeater、GridView、ListView等控件...

    idea插件-eval-resetter

    "idea插件-eval-resetter"是一款针对IntelliJ IDEA开发的插件,主要用于解决IDEA试用期到期或者评估限制的问题。在开发环境中,开发者经常需要使用IDEA进行项目开发,而IDEA的免费试用期有限,过了试用期后会受到...

    使用NLG-Eval需要依赖的数据包

    NLG_Eval是一款用于自然语言生成(Natural Language Generation, NLG)评估的工具,它能够帮助研究人员和开发者量化地分析生成文本的质量。在使用NLG_Eval之前,我们需要确保安装了必要的依赖数据包,以便该工具能...

    eval函数的一些用法

    本篇文章将深入探讨`eval()`函数的一些用法,并结合源码分析其工作原理和潜在的安全风险。 一、`eval()`函数的基本概念 `eval()`函数接收一个参数,这个参数必须是一个字符串。在执行时,`eval()`会将这个字符串...

    rank-eval-client-6.2.3-API文档-中英对照版.zip

    赠送jar包:rank-eval-client-6.2.3.jar; 赠送原API文档:rank-eval-client-6.2.3-javadoc.jar; 赠送源代码:rank-eval-client-6.2.3-sources.jar; 赠送Maven依赖信息文件:rank-eval-client-6.2.3.pom; 包含...

    ide-eval-resetter-2.2.3-031813.zip

    IDE-Eval-Resetter 是一个专门针对IDE的评估期重置工具,通常用于开发者在试用期结束后继续使用软件。版本号"2.2.3-031813"表示这是该工具的第2.2.3次更新,发布日期可能是2013年3月18日。这个工具主要解决的是IDE...

    Z.Expressions.Eval 4.0.68.zip

    《Z.Expressions.Eval 4.0.68:强大的表达式评估库》 在.NET开发领域,Z.Expressions.Eval是一款非常实用的库,主要用于解析和执行动态表达式。该库的最新版本4.0.68引入了对.NET 3.1和.NET 6框架的全面支持,为...

    test.rar_eval_eval;批量读取TXT文件

    "test.rar_eval_eval;批量读取TXT文件"这个标题暗示了我们将在一个名为"test.rar"的压缩包中找到若干MATLAB文件(.m文件),它们可能包含了使用`eval`函数批量读取TXT文件并进行矩阵处理的代码。 `eval`函数在...

Global site tag (gtag.js) - Google Analytics