繁体   English   中英

我可以将第三方JavaScript沙盒化以保护全局名称空间吗?

[英]Can I sandbox 3rd party JavaScript to protect the global namespace?

在工作中,我必须处理很多(有时很糟糕)JavaScript,供应商希望我们将它们放到我们的网站中。 其中一些将任意的,未命名空间的名称添加到全局范围。 我一直在考虑将这些程序沙箱化的不同想法,因此它们无法直接访问全局范围,但是我一直无法想到任何可能有效的方法。 (我曾考虑过对获取的代码进行评估,但是我坚信那是个坏主意。)

有哪些解决方案可以在仍然使用任意第三方JavaScript的情况下保持全局范围整洁?

编辑:@kirilloid的评论告诉我,我不清楚该代码的交付方式。 通常我不会得到要放入我们网站的代码 大多数时候,我只是得到一个URL,并被要求创建一个指向它的script标签。

您的选择非常有限。 如果您以无法修改的<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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM