2012-07-06 113 views
4

请看这片用于JavaScript的ArcGIS 3.0中的代码。 https://serverapi.arcgisonline.com/jsapi/arcgis/?v=3.0为什么需要if(0)和if(1)

里面有“if(0)”和“if(1)”,为什么需要这个?如果(0)总是假,并且如果(1)总是正确的,是不是?

+5

也许是因为它是一个模糊代码:http://en.wikipedia.org/wiki/Obfuscation_(software) – Jack 2012-07-06 02:14:50

+0

@Jack为什么Dojo会在http://dojotoolkit.org/download/上混淆他们提供的未压缩代码? – 2012-07-06 02:20:07

回答

2

是的,0始终为false,并且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)

你可以阅读更多关于混淆here

另一个可能的解释是,这些if语句被用来代替尚未实现的真实逻辑,如@mvbl fst提到的。

+2

我不同意。 'if(1)'语句出现在完全打开的Dojo代码中,如他们的网站上所示 - 他们为什么要混淆?我的意思是说,这个版权声明之后的代码实际上不包含任何“if(1)”语句;它都是Dojo代码的一部分。 – 2012-07-06 02:21:26

1

这可以用来代替实际的if()语句,但实际的逻辑尚未实现。正如@houbysoft提到的,它们被解释为布尔错误和真实。因此,同时他们使用false或true来确保内部总是执行(或不),并且打算稍后添加实际检查。

+0

由于未压缩的Dojo代码显示(请参阅http://download.dojotoolkit.org/release-1.7.3/dojo.js.uncompressed.js),实际上有'if(1){...} else {。 ''陈述,这对你的解释是有意义的。 – 2012-07-06 02:33:06

3

Dojo构建工具是什么(在给定的构建选项下),但不是混淆。如果您查看非构建的dojo.js和相应的构建的dojo.js.uncompressed.js文件,可以看到构建工具正在使用硬连线真/假测试替换has(“somefeature”)调用。正如所注意到的,这可以并确实创建不可达的代码。为什么要这样做?因为然后一个智能优化编译器(例如Google Closure)可以删除所有死代码,从而产生一个更小的文件(有时候更小......这就是要点)。

概念上讲,它是这样的:

  1. 非内置的代码有“厨房水槽”与动态评估有()调用。
  2. 您可以使用选项指定您的自定义构建中您所做的/不想要的构建配置文件。
  3. 构建过程替代动态has()调用[对应的构建选项]与硬连线真/假测试(或更好的方式来看它是进/出测试)。
  4. Closure编译器在缩小期间删除“out”代码。

查看当前的“Dojo Build System”文档和http://jamesthom.as/blog/2012/08/03/finding-nano/了解更多信息。还有,这个过程的here's a good low/code-level description

P.S. “如果(0)/ if(1)”不是真正的混淆......反之。如果有人想混淆,他们更有可能具有“如果(a)... if(b)... if(c)但是,限制器会比自己产生更多的混淆代码。通过Closure运行前后查看dojo.js源代码;最终产品与原始产品几乎没有相似之处。

相关问题