为什么需要使用 if(0) 和 if(1)?

5
请看以下有关ArcGIS 3.0 for JavaScript的代码片段:https://serverapi.arcgisonline.com/jsapi/arcgis/?v=3.0。其中包含了“if(0)”和“if(1)”语句,这是为什么呢?难道不是if(0)永远为假,if(1)永远为真吗?需要注意的是,这两个语句只是用来举例说明条件语句的使用方法,并不会对程序产生实际影响。

5
可能是因为这是一段混淆代码:http://zh.wikipedia.org/wiki/%E6%B7%B7%E6%B7%86%E4%BB%A3%E7%A0%81 - Jack
@Jack 为什么Dojo会对他们在http://dojotoolkit.org/download/提供的未压缩代码进行混淆处理? - Ian Hunter
3个回答

4
道场构建工具是用于执行此操作的(在给定的构建选项下),但不包括混淆。如果您查看非构建的dojo.js和相应构建的dojo.js.uncompressed.js文件,您会发现构建工具正在将has(“somefeature”)调用替换为硬编码的true / false测试。正如注意到的那样,这可能会创建无法访问的代码。为什么要这样做?因为聪明的优化编译器(例如Google Closure)可以删除所有死代码,从而产生更小的文件(有时要小得多...这就是重点)。
从概念上讲,它大致如下: 1. 非构建代码具有带有动态评估has()调用的“厨房水槽”。 2. 您使用指示自定义构建中需要/不需要什么的选项配置构建配置文件。 3. 构建过程使用硬编码的true / false测试(或更好的方式是进行内部/外部测试)替换动态的has()调用[对应于相应的构建选项]。 4. Closure编译器在缩小期间删除“out”代码。

查看当前的"Dojo Build System"文档和http://jamesthom.as/blog/2012/08/03/finding-nano/以获取更多信息。此外,这个过程的低/代码级别的良好描述在此处

P.S. "if(0)/if(1)"并不真正意味着混淆...相反,有人想要混淆,他们更可能有"if(a)...if(b)...if(c)..."变量远离设置。然而,缩小器会产生比那更混淆的代码。在运行Closure之前和之后检查dojo.js源代码; 最终产品与原始代码几乎没有任何相似之处。


2

是的,0代表假,1代表真。

然而,正如您在代码中看到的,该公司认为这是他们的商业秘密:

COPYRIGHT 2009 ESRI

 TRADE SECRETS: ESRI PROPRIETARY AND CONFIDENTIAL
 Unpublished material - all rights reserved under the
 Copyright Laws of the United States and applicable international
 laws, treaties, and conventions.

通常对这种代码进行混淆(即使其难以阅读)。一种方法是插入无用的语句,比如你看到的if(1)if(0)
您可以在此处了解有关混淆的更多信息
另一个可能的解释是这些if语句被用来代替尚未实现的真正逻辑,如@mvbl fst所提到的。

2
我不同意。if(1)语句出现在Dojo网站上完全开放的代码中,他们为什么要混淆呢?我的意思是说,在版权声明之后的所有代码中都没有任何if(1)语句;这都是Dojo代码的一部分。 - Ian Hunter

1

如果尚未实现实际逻辑,则可以使用此语句替代真正的if()语句。正如@houbysoft所提到的,它们被解释为布尔值false和true。因此,暂时使用false或true来确保内部语句始终执行(或不执行),并打算稍后添加实际检查。


正如未压缩的 Dojo 代码所示(请参见 http://download.dojotoolkit.org/release-1.7.3/dojo.js.uncompressed.js),实际上存在 if(1){...}else{...} 语句,这与您的解释是符合逻辑的。 - Ian Hunter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接