防止全球范围的污染

Alb*_*reo 5 javascript global-variables

我们正在努力为我们正在开发的项目强制执行 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>
Run Code Online (Sandbox Code Playgroud)

我想做的是在页面脚本运行之前但在库加载之后“锁定”window对象并防止对其进行任何添加(例如var foo = 'foo';在全局范围内或)。window['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);
Run Code Online (Sandbox Code Playgroud)

但他们只是清理了全局范围,并没有阻止第一空间的污染。

有可能做到吗?我们不关心该解决方案是否会破坏 JavaScript 代码并污染全局范围,我们会认为它是一个优点,因为它将迫使开发人员遵循最佳实践。

Ps 是的,我确实知道最好的解决方案是代码审查,遗憾的是它们在我们的情况下不可行,因此我们正在寻找一种包罗万象的解决方案。

fnl*_*nln -1

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

(function(){
  // ... Your code ...
}();
Run Code Online (Sandbox Code Playgroud)

您可以使用以下方法阻止在 chrome 中分配给窗口。

Object.preventExtensions(window)
Run Code Online (Sandbox Code Playgroud)