2012-08-31 77 views
2

所以看起來,調試正在獲得一個新的含義,至少在Closure Compiler中。Closure編譯器--debug解決我的bug

我有一個相當大的代碼庫,隔離問題是一項艱鉅的任務。在我的入口點類中,我實例化了依賴關係。其中之一,沒有正確創建,對象在那裏,但它的構造函數沒有被調用。

這隻發生在高級模式,所以我試圖通過 - 調試標誌,瞧,錯誤消失,構造函數被調用。這是令人興奮的。我不能複製粘貼任何特定的代碼,你會建議什麼?

/** 
* @param {Element} parent 
* @param {Object} opts 
* @constructor 
*/ 
ns.App = function(parent, opts) { 
    this.options = new ns.Options(opts || {}); 

    var w = this.options.width || parent.offsetWidth; 
    var h = this.options.height || parent.offsetHeight; 
    this.view = new ns.AppView(w, h); 
    this.history = new ns.CommandManager(); 

    // .... 

    // this one doesn't get called 
    this.amx_ = new ns.ActivityManager(this, this.options); 
    // this one does 
    this.output_ = new ns.Writer(); 
    this.bind_(); 
}; 
+3

當調試解決問題時,它通常表明您有競爭條件。 – jbabey

+1

@jbabey雖然我一般同意你的說法,這有一個競爭條件的症狀,在JS(單線程)我不認爲這是可能的。 – helpermethod

+0

@OliverWeiler大多數JavaScript錯誤都是競爭條件,這是可能的和可能的。 – jbabey

回答

2

使用Closure編譯器,當調試標誌使錯誤消失時,它通常表明您有一個重命名衝突。這可能是由於外部定義的對象的屬性未完全定義給編譯器而導致的。編譯器將您的屬性重命名爲與現有屬性相同的名稱。

這也可能是由於使用帶引號的語法(obj['prop'])聲明瞭使用虛線語法(obj.prop)的屬性引起的。根據定義,編譯器將這些視爲不同的屬性。

確保您打開--warning_level VERBOSE以幫助識別訪問未定義的屬性。雖然你的特殊情況仍然有可能不被承認。

+0

嗯,我不確定重命名是否是問題,但用'--warning_level VERBOSE',我解決了一些_tiny_問題,現在看起來工作正常。它仍然不能解釋爲什麼'this.amx_ = new ns.ActivityManager()'沒有被調用,並且上面和下面的東西是。 – skrat

+0

完全同意乍得。 --debug主要用於解決命名問題。除了將事物重命名爲可預測的名稱之外,它什麼也不做。如果--debug解決了它,那麼這是一個命名問題。這個錯誤可能比你意識到的更微妙。例如,瞭解Closure首先將變量重命名爲單字符,然後重命名爲雙字符。你確定你的webapp中沒有可能與這些名字發生衝突的東西嗎?請記住,DOM節點上的屬性不區分大小寫,所以如果某些內容被重命名爲「iD」,它將覆蓋DOM節點的「id」。 –

+0

我建議你看看ns.ActivityManager被重命名爲什麼,並檢查它是否與名稱相似的東西衝突或被覆蓋。 –