我不确定全局变量的数量本身就是一个有用的指标。您应该做一些分析来确定哪些是由代码创建的,这些代码是特定于主机的,并且与环境相关(如DOM)。
在浏览器中,窗口对象是global object的同义词,主机被允许在其原型属性添加到它(例如window.name)以及定义属性(如果有的话) 。另外,所有元素ID都是作为窗口的属性创建的(你可以责怪微软和IE),所以如果有很多元素ID,那么会有很多全局属性。
无论如何,下面是计算全局(窗口)对象自身可枚举属性的两种方法。它使用一个IIFE,所以它本身不会创建任何属性。
// Create 3 global properties
var x, y, z;
(function(global) {
// for..in with hasOwnProperty check
var count = 0;
for (var prop in global) {
if (global.hasOwnProperty(prop)) {
count++;
}
}
console.log('for..in count: ' + count +
// Direct count using Object.keys
'\nObject.keys : ' + Object.keys(global).length);
// Pass global (window in a browser) object to function
}(this));
因此,在浏览器的方法来测试代码创建的变量可能是:
- 伯爵全球性的“空”的文件数量,即应该是默认的主机定义集
- 计算可疑文档中全局属性的总数
- 使用ID计算文档中元素的数量
因此,代码创建的全局变量的数量应该是项目2 - (项目1 +项目3)的结果。
你可以指望与ID类似的元素:
var allEls = document.getElementsByTagName('*');
var idCount = 0;
for (var i=0, iLen=allEls.length; i<iLen; i++) {
if (allEls[i].id != '') {
++idCount;
}
}
或:
[].filter.call(document.getElementsByTagName('*'), function(el) {
return el.id != '';
}).length;
迭代通过'window'的属性?谨防原型成员,如果你不想数那些。 – Li357
很可能,这个代码库有很多其他问题。有一些静态代码分析工具可能对您更有用。我之前使用过Code Climate。它吸取了很多东西。只要注意这些工具...他们生成的报告只是一个指导,而不是一个明确的TODO清单。总会有一些东西可以接受,这很可能会错过一些东西。但是,如果你只是想要一个如何拧紧我的指标,那些工具是相当不错的。 – Brad
@AndrewLi这就是我想的;但是,我从来没有用JS来遍历全局或窗口属性。 (我试图完全使用对象或简单的程序脚本) – KareemElashmawy