因此,在Felix Kling和Lèse majesté留下一些评论之后,我找到了一个行之有效的解决方案。在加载任何库或我自己的代码之前,我创建了dashboard
全局对象(我唯一有意的)并存储了一个附加到的对象列表window
:
var dashboard = {
cache: {
load: Object.getOwnPropertyNames(window)
}
};
然后,在我加载了所有库之后,但在加载我自己的任何代码之前,我修改了dashboard
对象,添加了pollution
方法(在新的debug
命名空间中):
dashboard.debug = {
pollution: (function() {
var pollution,
base = cache.load, // window at load
filter = function(a,b) { // difference of two arrays
return a.filter(function(i) {
return !(b.indexOf(i) > -1);
});
},
library = filter(Object.getOwnPropertyNames(window), base),
custom = function() {
return filter(Object.getOwnPropertyNames(window),
base.concat(library));
};
delete cache.load;
pollution = function() {
console.log('Global namespace polluted with:\n ' +
custom().length + ' custom objects \n ' +
library.length + ' library objects');
return {custom: custom().sort(), library: library.sort()};
};
return pollution;
}())
};
在任何时候,我都可以从控制台调用此方法并查看
被污染的全局命名空间:
53 个自定义对象
44 个库对象
以及列出与这些对象关联的键的两个数组。base
和快照是静态的library
,而当前的自定义测量(通过custom
)是动态的,因此如果我要通过 AJAX 加载任何自定义 javascript,那么我可以重新测量并查看任何新的自定义“污染”。