2011-11-21 44 views
1

我該如何告訴閉包編譯器一個匿名函數不應該作爲死代碼去除?我不想將該函數存儲到窗口對象。我正在尋找替代技術。是否有可能將匿名函數標記爲「Live Code」,以便Closure編譯器不會將其刪除?

說我有一個JavaScript文件,其中包含一個巨大的匿名函數。

(function(){return "I am here!"}) 

有關使用方法,我通過AJAX下載這個功能,然後捕獲的eval使用的東西輸出像

var f = eval('(function(){return "I am here!"})'); 

這在分配變量f匿名函數。

d8> var f = eval('(function(){return "I am here!"})'); 
d8> f 
function(){return "I am here!"} 
d8> f() 
I am here! 

當我通過包含單個大型匿名函數的js文件運行編譯器時,編譯器通過不輸出任何內容來「優化」我的代碼。這顯然不是我想要的。是否有某種JS​​Doc我可以把我的函數上面標記爲不是死代碼?

~~~~~~~~~~~~~~~~~~~~~~~~

解決方法:(這是不是真的是我想要的,但它似乎是有可用的工具)的最好成績

~~~~~~~~~~~~~~~~~~~~~~~~

我結束了使用的約翰和大衛的組合回答:

// code would be provided from an ajax request 
var code = 'function F(){return "I am here!"};' 

code = "("+code.replace(/\s*\;\s*$/, "")+");" 

f = eval(code); 

給函數一個名字使得Closure編譯器很開心。

根據函數的不同,閉包編譯器會定義函數以外的變量,所以我將代碼包裝在括號中以避免定義全局變量。

replace方法只是移動最後一個用於分隔函數定義的分號,以便它不會導致語法錯誤。

回答

1

您可以將函數存儲在文件中而不使用包裝器,這會阻止編譯器「優化」它,然後在評估它時添加函數包裝器。

var code = 'return "I am here!";'; 
var f = eval('(function(){' + code + '})'); 

如果你的代碼確實是沒有功能的包裝「無效」,你可以把它包好,但執行的包裝,然後繼續如上。例如:

var code = '(function(){return "I am here!";}())'; 
var f = eval('(function(){return ' + code + '})'); 
+0

沒有函數包裝器,函數塊內部的代碼是無效的,所以它不會編譯。編譯器與JSC_PARSE_ERROR – user319862

+0

扼流器呃,它是如何無效?你可以發佈代碼嗎?否則,嘗試立即執行函數包裝器,並仍然按照我的建議 – david

+0

重新包裝它,即使簡單的「我在這裏」代碼也是無效的,除非包含在函數中,因爲返回語句:SyntaxError:非法返回語句 – user319862

1

該編譯器不能與代碼片段配合使用。我看到的唯一解決方案是使代碼有效。

var a = (function() {...})(); 

並後處理代碼剝離你不想要的部分。即使這可能無法在ADVANCED模式下使用,因爲它可能會嘗試內聯該功能。

+0

我也試過這個。簡單模式工作正常,但高級模式不喜歡它。它也移動了var e = null;功能外,所以一個簡單的地帶不起作用。 – user319862

+0

如果你正在嘗試使用高級模式,你可以使用編譯器的「輸出包裝器」和extern來完成你想要的。使用這個包裝: (function(){var result;%output%; return result}) 您想確保「result」不會與代碼中的名稱發生衝突,並將其聲明在您的extern定義中。 – John

相關問題