【发布时间】:2014-04-09 10:25:11
【问题描述】:
我们正在尝试为我们正在处理的项目强制执行 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 对象并防止对其进行任何添加(例如,全局范围内的var foo = 'foo'; 或window['foo'] = 'foo';)。
我已经查看了Object.freeze、Object.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 代码,我们认为这是一个加分项,因为它会迫使开发人员遵循最佳实践。
附:是的,我知道最好的解决方案是代码审查,遗憾的是在我们的情况下它们不可行,所以我们正在寻找一个包罗万象的解决方案。
【问题讨论】:
标签: javascript global-variables