2012-03-09 56 views
2

在工作中,我必須處理供應商期望我們放入我們網站的很多(有時很糟糕的)JavaScript。它們中的一些向全局範圍添加了任意的,未命名空間的名稱。我一直在玩弄有關沙盒這些程序的不同想法,因此他們無法直接訪問全球範圍,但我一直無法想到任何可能真正起作用的東西。 (我想到了刪除代碼,但我確信這不是一個好主意。)我可以沙盒第三方JavaScript來保護全局名稱空間嗎?

有什麼解決方案可以保持全局範圍的清潔,同時仍然使用任意的第三方JavaScript?

編輯:@ kirilloid的評論告訴我我不清楚這個代碼是如何交付的。我通常不會將代碼放入我們的網站。大多數情況下,我只是給了一個URL並要求創建一個指向它的script標記。

+0

插入代碼放到你的函數調用中,只顯示函數,你的需要。 http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth – kirilloid 2012-03-09 14:51:20

+0

@kirilloid對此感到抱歉。如果我有代碼使用模塊模式,我可以使用模塊模式。我會用上面的* eval *思路做到這一點,但大多數情況下我只是指向指向其他地方託管的第三方腳本的URL。我已更新我的問題以反映這一點。 – kojiro 2012-03-09 14:55:07

回答

4

您的選擇非常有限。如果代碼以<script>標記的形式呈現給您,您無法修改,則可以立即停止嘗試。

如果您可以修改腳本,可以將代碼封裝在閉包中;這將停止在全局範圍內發佈var所聲明的任何變量(但您仍然會遇到隱式全局問題)。

(function() { 

    var aGlobalVariableThatUsedToCauseACollision = 4; // no longer collides! 

    anotherGlobalVariableThatUsedToCauseACollision = 4; // Mmmmm. 

}()); 

可能是不可行的選擇;你可以使用「嚴格使用」來防止它們使用隱式全局變量,但是如果代碼看起來很糟糕,這不會對你有所幫助。

另外一個變化(和prehaps最好的),你可以做可能會來包裝你自己代碼封閉,並保持的重要窗口屬性的本地副本(undefined)等在那裏;這樣你可以防止其他腳本影響你的(這就是jQuery這樣的庫)。

(function (jQuery, $, undefined) { 
    alert(undefined == 4); // false! 
}(jQuery, $)); 

undefined = 4; 
+1

同意,如果他們的代碼太糟糕了,他們可能依賴於對全局命名空間對象的引用,並且對此進行沙盒或更改其命名空間可能會破壞它。最好的選擇是保護自己免受不良影響。 – jjNford 2012-03-09 14:57:56

相關問題