5

查看这篇文章以获取 ArcGIS 3.0 for javascript 中的代码。https://serverapi.arcgisonline.com/jsapi/arcgis/?v=3.0

里面有“if(0)”和“if(1)”,为什么需要这个?if(0) 不是永远为假,if(1) 不是永远为真吗?

4

3 回答 3

4

Dojo 构建工具就是这样做的(在给定的构建选项下),但不是为了混淆。如果您查看未构建的 dojo.js 和相应的构建的 dojo.js.uncompressed.js 文件,您可以看到构建工具正在用硬连线的真/假测试替换 has("somefeature") 调用。如前所述,这可以并且确实会创建无法访问的代码。为什么要这样做?因为这样一个智能优化编译器(例如 Google Closure)可以修剪掉所有的死代码,从而产生一个更小的文件(有时更小......这就是重点)。

从概念上讲,它是这样的:

  1. 非构建代码具有动态评估的 has() 调用的“厨房水槽”。
  2. 您可以使用选项来配置构建配置文件,这些选项指示您在自定义构建中需要/不想要什么。
  3. 构建过程用硬连线的真/假测试替换动态 has() 调用 [用于相应的构建选项](或者更好的查看方式是输入/输出测试)。
  4. 闭包编译器在缩小期间删除“输出”代码。

查看当前的“Dojo Build System”文档和http://jamesthom.as/blog/2012/08/03/finding-nano/了解更多信息。此外,这里是这个过程的一个很好的低级/代码级描述

PS“if(0)/if(1)”并不是真正的混淆......有点相反。如果有人想混淆,他们更有可能有“if(a)...if(b)...if(c)...”,其中 vars 设置得很远很远。然而,minifiers 产生的混淆代码比它们自己产生的更多。在通过 Closure 运行之前和之后检查 dojo.js 源代码;最终产品与原始产品几乎没有相似之处。

于 2012-12-01T15:03:22.260 回答
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)and 。if(0)

您可以在此处阅读有关混淆的更多信息。

另一种可能的解释是,这些if语句用于代替尚未实现的真实逻辑,正如@mvbl fst 提到的那样。

于 2012-07-06T02:16:54.763 回答
1

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

于 2012-07-06T02:19:08.163 回答