我不確定全局變量的數量本身就是一個有用的指標。您應該做一些分析來確定哪些是由代碼創建的,這些代碼是特定於主機的,並且與環境相關(如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