【问题标题】:Can I sandbox 3rd party JavaScript to protect the global namespace?我可以沙箱 3rd 方 JavaScript 来保护全局命名空间吗?
【发布时间】:2012-03-27 00:24:30
【问题描述】:

在工作中,我必须处理供应商希望我们放入网站的大量(有时很糟糕)JavaScript。其中一些将任意的、未命名空间的名称添加到全局范围。我一直在玩弄关于沙盒这些程序的不同想法,因此它们无法直接访问全局范围,但我一直无法想到任何可能真正起作用的东西。 (我想过评估获取的代码,但我确信这是个坏主意。)

有哪些解决方案可以在仍然使用任意 3rd 方 JavaScript 的同时保持全局范围的清洁?

编辑:@kirilloid 的评论告诉我,我还不清楚这段代码是如何交付的。我通常不会获得代码 来放入我们的网站。大多数时候,我只是得到一个 URL,并要求我创建一个指向它的 script 标记。

【问题讨论】:

  • 将丢给您的代码插入函数调用并仅公开您需要的函数。 adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth
  • @kirilloid 很抱歉造成混乱。如果我有使用模块模式的代码,我可以使用模块模式。我会用我上面的 eval 想法做到这一点,但大多数时候我只是得到一个指向托管在其他地方的第三方脚本的 URL。我已经更新了我的问题以反映这一点。

标签: javascript namespaces global-variables


【解决方案1】:

您的选择非常有限。如果代码以 <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;

【讨论】:

  • 同意,如果他们的代码如此糟糕,他们可能依赖于对全局命名空间对象的引用,并且对它进行沙箱化或更改其命名空间可能会破坏它。最好的选择是保护自己免受不良影响。
猜你喜欢
  • 2014-05-10
  • 1970-01-01
  • 2016-03-19
  • 2013-04-08
  • 2013-11-19
  • 2016-08-03
  • 1970-01-01
  • 2017-01-04
  • 2023-03-28
相关资源
最近更新 更多