2012-07-06 227 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源代碼;最終產品與原始產品幾乎沒有相似之處。

相關問題