查看这篇文章以获取 ArcGIS 3.0 for javascript 中的代码。https://serverapi.arcgisonline.com/jsapi/arcgis/?v=3.0
里面有“if(0)”和“if(1)”,为什么需要这个?if(0) 不是永远为假,if(1) 不是永远为真吗?
查看这篇文章以获取 ArcGIS 3.0 for javascript 中的代码。https://serverapi.arcgisonline.com/jsapi/arcgis/?v=3.0
里面有“if(0)”和“if(1)”,为什么需要这个?if(0) 不是永远为假,if(1) 不是永远为真吗?
Dojo 构建工具就是这样做的(在给定的构建选项下),但不是为了混淆。如果您查看未构建的 dojo.js 和相应的构建的 dojo.js.uncompressed.js 文件,您可以看到构建工具正在用硬连线的真/假测试替换 has("somefeature") 调用。如前所述,这可以并且确实会创建无法访问的代码。为什么要这样做?因为这样一个智能优化编译器(例如 Google Closure)可以修剪掉所有的死代码,从而产生一个更小的文件(有时更小......这就是重点)。
从概念上讲,它是这样的:
查看当前的“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 源代码;最终产品与原始产品几乎没有相似之处。
是的,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 提到的那样。
这可以用来代替实际逻辑尚未实现的真实 if() 语句。正如@houbysoft 提到的,它们被解释为布尔值假和真。因此,他们同时使用 false 或 true 来确保内部的语句始终执行(或不执行),并打算稍后添加实际检查。