![](/img/trans.png)
[英]Why does this cause an “invalid syntax” error with Google's Closure Compiler?
[英]Why is Closure Compiler generating different syntax?
為什么Closure Compiler為以下兩個函數生成不同的代碼(使用高級選項):
var function1 = function() {
return 1 * Math.random();
};
window['function1'] = function1; // export function1
var function2 = function() {
return function1() + 1;
};
window['function2'] = function2; // export function2
這是生成的代碼:
function a() {
return 1 * Math.random();
}
window.function1 = a;
window.function2 = function() {
return a() + 1; // call to a() fails in a more complex example
};
注意, function1
已重命名為a
並且a
分配給了全局變量function1
。 使用function2
,沒有其他變量名與之關聯。 為什么?
我之所以問的是,在情況下,我的代碼,調用function1
從function2
,因為改名失敗function1
不視為一個函數調用function2
而是JavaScript解釋認為, a()
是一個數字。
任何見解均表示贊賞。 TIA。
使用ADVANCED_OPTIMIZATIONS,closure編譯器將刪除未使用的代碼。 由於function2
的唯一用途是在導出中,因此直接對導出的名稱進行賦值(而不是首先對變量進行賦值)。 function1
既被導出又被function2
使用,因此編譯器保留了最初的命名函數,因為它被兩次引用。
至於失敗,我們需要查看您的實際代碼來解釋正在發生的事情。
如果“ a”是數字,則很可能會被其他東西覆蓋。 如果您不使用多個模塊,請嘗試使用輸出包裝器選項來隔離全局變量(如果使用多個模塊,則可以使用其他選項來隔離全局變量)。 通常在“ windows.a”上定義一個setter並在其中設置一個斷點將使您知道這種覆蓋是如何發生的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.