2012-03-09 54 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

相关问题