我有一種情況,我試圖將多個Javascript文件合併爲一個,並有條件地應用它們。我不想修改實際的文件。有沒有辦法可以包裝這些文件並按需求調用它們?嵌套函數可以放在Javascript的全局範圍內嗎?
問題是,其中一些文件的函數中有xyz(){}。所以,用if(false){function xyz(){}}包裝它們會使不好的事情發生。
例如,如果這是我的代碼...
if (includeFile) {
/* The file */
function foo() {}
/* The file */
}
的問題變得那麼Chrome將看到FOO(),並將其放置在全球範圍內even if includeFile is false。
簡單的解決方案是將其修改爲var foo = function(){}但我無法修改這些文件。
我也有一個關於在這些函數上運行eval()的普遍擔心,因爲它們相當大。 (認爲jQuery包裝在一個函數中,如果這不是問題,那麼也許eval就是答案?)
我希望我可以嵌套函數並通過窗口作爲範圍,但tried it on jsFiddle and it didn't seem to work。
(function() {
function foo() {
alert('it works');
}
}).apply(window, []);
foo();
有幾個similarquestions。但是,沒有一個提到我有同樣的情況。謝謝。
所以問題是有多個文件之間的名稱衝突 - 多個函數xyzs?修改它們真的很糟糕 - 你擔心引入錯誤還是保持與上游兼容?你能否機械地進行重命名,例如sed或用某種縮小工具? – Rup 2012-01-10 01:06:53
我正在思考一個縮小工具或宏預處理器的線條。你需要處理多少個xyz?而且,如果只有部分內容將在任何給定頁面上執行,將所有這些內容放在一個文件中是否最好? – 2012-01-10 01:28:49
那麼,這個想法是,根據頁面和上下文,我們有太多的文件加載。大約100個各種資源(包括css /圖像)。所以,爲了減少這個數字,我們試圖將經常使用的一些文件組合起來。在這種情況下,一些是圖書館,一些是我們的內部代碼。 直到這一點我們沒有擔心將功能XYZ(){}在全球範圍內。使用新的組合文件,如果(false){function xyz(){}}在全局範圍中結束,所以我們想到將它包裝在var foo = function(){function xyz(){}}中; if(false){foo(); } – 2012-01-10 15:30:00