防止全球范围的污染



我们正在尝试为我们正在研究的项目执行JavaScript最佳实践,我们试图设定的限制之一就是不污染全局范围。

我们有一个用于这样构建的页面的HTML模板:

<!DOCTYPE html>
<html>
    <head>
        <title>Test</title>
    </head>
    <body>
        <h1>Test</h1>
        <!-- Page content here -->
        <script src='https://code.jquery.com/jquery-2.1.0.js'></script>
        <script src='https://ajax.googleapis.com/ajax/libs/angularjs/1.2.14/angular.js'></script>
        <!-- Page scripts here -->
    </body>
</html>

我要做的是"锁定" window对象,并在页面脚本运行之前,但在库加载后,请防止其添加的任何添加(例如,全局范围或window['foo'] = 'foo';中的var foo = 'foo';)。

我已经看过Object.freezeObject.seal,但它们不适用于window对象(它们提出了TypeError: can't change object's extensibility例外)。

我还查看了这样的"清理"脚本:

// Include this after the libraries.
(function(window) {
    var cache = {};
    for (var key in window) cache[key] = key;
    window.cache = cache;
})(window);
// Include this after all scripts.
(function(window) {
    var taint = {};
    for (var key in window) taint[key] = key;
    for (var key in window.cache) = delete taint[key];
    for (var key in taint) delete window[key];
})(window);

,但他们只能清理全球范围,不会阻止第一个空间的污染。

可以做到吗?我们不在乎解决方案是否打破了JavaScript代码污染全局范围,我们将考虑这一点,因为它将迫使开发人员遵循最佳实践。

P.S。是的,我确实知道最好的解决方案是代码评论,可悲的是,在我们的情况下它们不可行,因此我们正在寻找一个解决方案。

从var关键字锁定全局变量,将代码包装在匿名闭合中。

(function(){
  // ... Your code ...
}();

您可以通过以下内容防止分配到Chrome中的窗口。

Object.preventExtensions(window)

相关内容

  • 没有找到相关文章

最新更新