【问题标题】:Why the need for if(0) and if(1)为什么需要 if(0) 和 if(1)
【发布时间】:2012-07-06 11:41:22
【问题描述】:

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

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

【问题讨论】:

标签: javascript arcgis


【解决方案1】:

是的,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)

您可以阅读有关混淆的更多信息here

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

【讨论】:

  • 我不同意。 if(1) 语句出现在他们网站上完全开放的 Dojo 代码中——他们为什么要混淆?我的意思是说,此版权声明之后的代码实际上都没有包含任何if(1) 声明;这都是 Dojo 代码的一部分。
【解决方案2】:

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

【讨论】:

【解决方案3】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2016-08-31
    • 1970-01-01
    • 2012-09-10
    • 2013-08-10
    • 1970-01-01
    • 2013-05-03
    • 1970-01-01
    • 2015-02-16
    • 2022-01-25
    相关资源
    最近更新 更多