1

如果通過高級優化運行以下代碼,我仍然可以在代碼中看到調試語句。經過高級模式編譯使用Google Closure Compiler去除調試代碼

(function() { 
     var a = console.info.bind(console), 
      b = { 
       max: 100, 
       debug: !1 
      }; 
     b.debug && a("This should be in debug mode only"); 
     "function" == typeof alert && alert(b); 
     a("Brady", Math.random() * b.max | 0); 
    })(); 

如何才能擺脫調試信息與先進模式

var log = console.info.bind(console); 
    (function() { 
     /** @const */ 
     var DEBUG = false; 

     log('Brady', createRank({ 
      max: 100, 
      debug: DEBUG 
     })); 
    })(); 
function createRank(options) { 
    if (options.debug) { 
     log('This should be in debug mode only'); 
    } 
    if(typeof alert == 'function'){ 
     alert(options); 
    } 
    return (Math.random() * options.max) | 0; 
} 

輸出?

如果調試變量被定義爲全局的,和日誌記錄語句被封入等

如果(DEBUG){ 日誌( '調試消息'); }

那麼它會工作,但有沒有辦法讓它工作,如果我們不希望它作爲一個全局變量,而是通過參數傳遞給各個模塊/函數。

回答

0

這是當前優化集以及它們運行時的限制。優化是編譯時間和優化之間的折衷,所做的選擇對於每種代碼模式都不一定是理想的。

在這種特殊情況下,問題是「屬性摺疊」只發生一次全局作用域,並且發生在函數內聯之前(主要優化循環期間發生函數本地對象的「屬性摺疊」)。爲了將示例中的代碼刪除,「摺疊屬性」需要至少運行一次,或者需要增強功能本地版本(更保守)以在全局範圍內運行。

這也是在這裏討論:https://github.com/google/closure-compiler/issues/891

+0

看起來這是接近我們會得到回答的問題 – sbr 2015-04-01 22:41:25

相關問題