請看這片用於JavaScript的ArcGIS 3.0中的代碼。 https://serverapi.arcgisonline.com/jsapi/arcgis/?v=3.0爲什麼需要if(0)和if(1)
裏面有「if(0)」和「if(1)」,爲什麼需要這個?如果(0)總是假,並且如果(1)總是正確的,是不是?
請看這片用於JavaScript的ArcGIS 3.0中的代碼。 https://serverapi.arcgisonline.com/jsapi/arcgis/?v=3.0爲什麼需要if(0)和if(1)
裏面有「if(0)」和「if(1)」,爲什麼需要這個?如果(0)總是假,並且如果(1)總是正確的,是不是?
是的,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提到的。
我不同意。 'if(1)'語句出現在完全打開的Dojo代碼中,如他們的網站上所示 - 他們爲什麼要混淆?我的意思是說,這個版權聲明之後的代碼實際上不包含任何「if(1)」語句;它都是Dojo代碼的一部分。 – 2012-07-06 02:21:26
這可以用來代替實際的if()語句,但實際的邏輯尚未實現。正如@houbysoft提到的,它們被解釋爲布爾錯誤和真實。因此,同時他們使用false或true來確保內部總是執行(或不),並且打算稍後添加實際檢查。
由於未壓縮的Dojo代碼顯示(請參閱http://download.dojotoolkit.org/release-1.7.3/dojo.js.uncompressed.js),實際上有'if(1){...} else {。 ''陳述,這對你的解釋是有意義的。 – 2012-07-06 02:33:06
Dojo構建工具是什麼(在給定的構建選項下),但不是混淆。如果您查看非構建的dojo.js和相應的構建的dojo.js.uncompressed.js文件,可以看到構建工具正在使用硬連線真/假測試替換has(「somefeature」)調用。正如所注意到的,這可以並確實創建不可達的代碼。爲什麼要這樣做?因爲然後一個智能優化編譯器(例如Google Closure)可以刪除所有死代碼,從而產生一個更小的文件(有時候更小......這就是要點)。
概念上講,它是這樣的:
查看當前的「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源代碼;最終產品與原始產品幾乎沒有相似之處。
也許是因爲它是一個模糊代碼:http://en.wikipedia.org/wiki/Obfuscation_(software) – Jack 2012-07-06 02:14:50
@Jack爲什麼Dojo會在http://dojotoolkit.org/download/上混淆他們提供的未壓縮代碼? – 2012-07-06 02:20:07