簡體   English   中英

奇怪的Closure編譯器問題

[英]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.isAvailableframe.storeBack.LocalStore分開了。 如果發生這種情況 ,這就是編譯器名稱空間變平的行為。

您在麻煩將屬性放入構造函數本身時遇到麻煩-編譯器對您可能沒有想到的類進行了很多優化。

檢查調試輸出和變量名映射以確認。 您可能必須刪除閉包包裝器功能才能在映射文件中看到實際名稱。

不知道您的后端到底是什么...但是您不應該實例化它們嗎?

var backends = { localStore : new frame.storeBack.LocalStore(),
                 mem:         new frame.storeBack.Mem() };

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM