[英]Strange Closure Compiler issue
我在高級模式下使用Google的Closure Compiler,但遇到了一個奇怪的問題。 這是未編譯的代碼,正在運行的已編譯版本返回了log語句:
goog.provide('frame.store');
goog.require('frame.storeBack.LocalStore');
goog.require('frame.storeBack.Mem');
frame.store = (function() {
/** prioritised list of backends **/
var backends = [
frame.storeBack.LocalStore,
frame.storeBack.Mem
];
frame.log(backends);
// [function rc(){}, function tc(){this.q={}}]
frame.log(frame.storeBack.LocalStore === backends[0]);
// true
frame.log(frame.storeBack.LocalStore.isAvailable === backends[0].isAvailable);
// false
frame.log(frame.storeBack.LocalStore.isAvailable);
// function sc(){try{return"localStorage"in window&&window.localStorage!==k}catch(a){return l}}
frame.log(backends[0].isAvailable);
// undefined
for (var i=0, len=backends.length; i<len; i++)
if (backends[i].isAvailable())
return new backends[i]();
// Uncaught TypeError: Object function rc(){} has no method 'Ga'
throw('no suitable storage backend');
})();
出於某種原因,當通過后端數組訪問LocalStore時,靜態方法isAvailable不存在,而通過全局命名空間訪問靜態方法時,該方法存在。
誰能看到原因?
編輯:供參考,這是方法聲明:
frame.storeBack.LocalStore.isAvailable = function() {
try {
return 'localStorage' in window && window['localStorage'] !== null;
}catch (e) {
return false;
}
};
啟用--debug true
以檢查您的輸出以及將frame.storeBack.LocalStore.isAvailable
重命名為什么。
轉儲變量名稱映射以檢查frame.storeBack.LocalStore.isAvailable
是否已展平。
例如,使用Closure Compiler 可以拉平frame.storeBack.LocalStore.isAvailable
第一個frame$storeBack$LocalStore$isAvailable
,那么整個事情重新命名為全局函數“一”或什么的。 這稱為名稱空間的展平。 檢查調試輸出,以查看您的函數聲明是否已重命名為:
$frame$storeBack$LocalStore$isAvailable$$ = function() {
在這種情況下,直接調用frame.storeBack.LocalStore.isAvailable()
仍將調用展平的全局版本,這里沒有問題! 但是,您不能再確切地說isAvailable()
存在於frame.storeBack.LocalStore
(另一個對象)中。 現在,在已編譯的輸出中, frame.storeBack.LocalStore.isAvailable
和frame.storeBack.LocalStore
分開了。 如果發生這種情況 ,這就是編譯器名稱空間變平的行為。
您在麻煩將屬性放入構造函數本身時遇到麻煩-編譯器對您可能沒有想到的類進行了很多優化。
檢查調試輸出和變量名映射以確認。 您可能必須刪除閉包包裝器功能才能在映射文件中看到實際名稱。
不知道您的后端到底是什么...但是您不應該實例化它們嗎?
var backends = { localStore : new frame.storeBack.LocalStore(),
mem: new frame.storeBack.Mem() };
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.