我可以沙箱第三方JavaScript来保护全局命名空间吗?

时间:2012-03-09 14:47:17

标签: javascript namespaces global-variables

在工作中,我必须处理许多(有时可怕的)JavaScript,供应商希望我们将这些JavaScript放入我们的网站。其中一些名称会向全局范围添加任意的,未命名的名称。我一直在研究有关沙盒化这些程序的不同想法,因此它们无法直接访问全局范围,但我无法想到任何可能实际工作的东西。 (我想要改进所提取的代码,但我确信这是一个坏主意。)

在使用任意第三方JavaScript时,有哪些解决方案可以保持全局范围的清洁?

编辑:@ kirilloid的评论告诉我,我还不清楚这段代码是如何传递的。我通常不会将代码放入我们的网站。大多数情况下,我只是给了一个网址,并要求创建一个指向它的script标记。

1 个答案:

答案 0 :(得分:4)

您的选择非常有限。如果代码以<script>标签的形式呈现给您,您无法修改,则可以立即停止尝试。

如果你可以修改脚本,你可以将代码包装在一个闭包中;这将停止他们声明的var在全局范围内发布的任何变量(但是你仍然会遇到隐式全局变量的问题)。

(function () {

    var aGlobalVariableThatUsedToCauseACollision = 4; // no longer collides!

    anotherGlobalVariableThatUsedToCauseACollision = 4; // Mmmmm.

}());

可能是不可行的选择;你可以使用“use strict”来防止它们使用隐式全局变量,但如果代码看起来很糟糕,这对你没用。

您可以进行的其他更改(以及最佳选择)可以将自己的代码包装在闭包中,并保留重要窗口属性(undefined)等的本地副本在那里;这样就可以防止影响你的其他脚本(这就是像jQuery这样的库)。

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

undefined = 4;