2012-01-10 160 views
1

我有一種情況,我試圖將多個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。但是,沒有一個提到我有同樣的情況。謝謝。

+0

所以問題是有多個文件之間的名稱衝突 - 多個函數xyzs?修改它們真的很糟糕 - 你擔心引入錯誤還是保持與上游兼容?你能否機械地進行重命名,例如sed或用某種縮小工具? – Rup 2012-01-10 01:06:53

+0

我正在思考一個縮小工具或宏預處理器的線條。你需要處理多少個xyz?而且,如果只有部分內容將在任何給定頁面上執行,將所有這些內容放在一個文件中是否最好? – 2012-01-10 01:28:49

+0

那麼,這個想法是,根據頁面和上下文,我們有太多的文件加載。大約100個各種資源(包括css /圖像)。所以,爲了減少這個數字,我們試圖將經常使用的一些文件組合起來。在這種情況下,一些是圖書館,一些是我們的內部代碼。 直到這一點我們沒有擔心將功能XYZ(){}在全球範圍內。使用新的組合文件,如果(false){function xyz(){}}在全局範圍中結束,所以我們想到將它包裝在var foo = function(){function xyz(){}}中; if(false){foo(); } – 2012-01-10 15:30:00

回答

2

您是否考慮過使用類似require.js的圖書館?有幾個圖書館可以以更優雅的方式爲你做這件事。

如果您不想使用依賴加載庫,但使用jQuery或某些類似的庫,則可以使用AJAX請求(在jQuery中使用script dataType)有條件地加載腳本。這比簡單的eval()好得多,但當你試圖管理一系列依賴關係時,它的穩健性較差。

另一個選擇,如果你想簡單地串聯的一切,是包中的每個文件的匿名函數,然後分配必要的元素到window對象,將它們放置在全球範圍內:

(function(window) { 

    /* file 1 here */ 
    function xyz() { 
     // etc ... 
    } 
    /* end file 1 */ 

    // now selectively choose what you want to be 
    // in the global scope 
    window.xyz = xyz; 

}(window)); 

xyz(); 

然而,這需要更多的工作來確定您希望在全球範圍內提供的服務。請注意,必須注意將window作爲參數傳遞給匿名函數,但如果要多次引用它,這不是一個壞主意(這會加速引用並允許在代碼期間進行可變名稱的搜索)壓縮)。

+0

這是如果我們編寫所有從一開始的代碼,但同樣問題的主要焦點是,是否可以明確地把一個嵌套函數在全球範圍內一個很好的解決方案。 – 2012-01-10 15:35:00

+0

啊,我明白了。請參閱我的編輯 - 我認爲這解決了你要做的事情。 – nrabinowitz 2012-01-10 20:58:09

+0

謝謝。 [這似乎工作](http://jsfiddle.net/y9D7E/)。從我所知道的情況來看,我認爲這是我們最好的選擇。我可以忍受這一點,但我真的希望有一些聰明的包裝。你可以看到我希望能夠做些什麼(function(){function xyz(){}})。apply(window,[]);作爲一個偷偷摸摸的解決方案。 – 2012-01-11 06:35:24

相關問題