Javascript 防止全球范围的污染

Javascript 防止全球范围的污染,javascript,global-variables,Javascript,Global Variables,我们正在努力为我们正在进行的项目实施JavaScript最佳实践,我们试图设置的限制之一是不污染全局范围 我们有一个HTML模板用于每个页面,其结构如下: 试验 试验 我试图做的是在页面脚本运行之前,但在加载库之后,“锁定”窗口对象,并防止向其添加任何内容(例如var foo='foo';在全局范围内或窗口['foo']='foo';) 我已经看过了,但是它们不适用于窗口对象(它们引发了类型错误:无法更改对象的可扩展性异常) 我还研究了如下“清理”脚本: //在库之后包含此项。 (功能(窗口

我们正在努力为我们正在进行的项目实施JavaScript最佳实践,我们试图设置的限制之一是不污染全局范围

我们有一个HTML模板用于每个页面,其结构如下:


试验
试验
我试图做的是在页面脚本运行之前,但在加载库之后,“锁定”
窗口
对象,并防止向其添加任何内容(例如
var foo='foo';
在全局范围内或
窗口['foo']='foo';

我已经看过了,但是它们不适用于
窗口
对象(它们引发了
类型错误:无法更改对象的可扩展性
异常)

我还研究了如下“清理”脚本:

//在库之后包含此项。
(功能(窗口){
var cache={};
for(窗口中的var key)缓存[key]=key;
window.cache=cache;
})(窗口);
//在所有脚本之后都包括这个。
(功能(窗口){
var-taint={};
for(窗口中的var键)污点[key]=键;
for(var key in window.cache)=删除污点[key];
对于(污染中的var键)删除窗口[键];
})(窗口);
但它们只是在全球范围内进行清理,并不能防止第一空间的污染

有可能吗?我们不关心如果解决方案破坏了JavaScript代码污染全球范围,我们会认为这是一个优势,因为它将迫使开发人员遵循最佳实践。
另外,是的,我知道最好的解决方案是代码检查,遗憾的是,在我们的情况下,它们不可行,所以我们正在寻找一个全面的解决方案。

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

(function(){
  // ... Your code ...
}();
您可以使用以下方法防止在chrome中指定窗口

Object.preventExtensions(window)

您的解决方案不起作用:在Firefox 27中抛出
类型错误:无法更改对象的可扩展性
异常并停止脚本的执行,在Chrome 33和Internet Explorer 11中,不会抛出异常但不会阻止创建新对象。您在哪里运行它?如果我在Chrome中打开控制台,这将阻止我创建变量或添加到窗口。这是Chrome33。我制作了一个简单的HTML页面(你可以在上找到代码),并将其托管在IISExpress中。使用
var foo='foo'创建变量不被阻止,只有
window.bar='bar'被阻止且仅在Chrome中;Firefox引发了一个异常,InternetExplorer默默地接受了这个错误。