防止全球范围的污染
我们正在努力为我们正在开发的项目强制执行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代码,我们会认为它是一个加号,因为它会迫使开发人员遵循最佳实践。
Ps是的,我知道最好的解决方案是代码审查,可惜他们在我们的情况下不可行,所以我们正在寻找一个全面解决方案。
要从var关键字锁定全局变量,请将您的代码封装在匿名关闭中。
(function(){
// ... Your code ...
}();
您可以通过以下方式阻止以铬形式分配给窗口。
Object.preventExtensions(window)
链接地址: http://www.djcxy.com/p/18341.html