2017-06-07 607 views
-1

我正在開發另一個項目。我加載Chrome開發者工具來檢查全局變量的狀態。當我在Scope下打開Global時,我看到了大量的全局變量。我需要8秒鐘才能瀏覽它們。我已經在這個項目上工作了一段時間了,我知道全局變量是一個我們必須解決的問題;但是,*與我的問題無關。如何計算全局範圍內全局變量的數量?

傳達我們全球範圍內的規模被淹沒,我想計算在全球範圍內

如何做到這一點目前實例變量的數目?

我正在尋找JavaScript中的答案,我可以在我的控制檯中立即執行。基本上可以遍歷全球範圍和count++

+1

迭代通過'window'的屬性?謹防原型成員,如果你不想數那些。 – Li357

+0

很可能,這個代碼庫有很多其他問題。有一些靜態代碼分析工具可能對您更有用。我之前使用過Code Climate。它吸取了很多東西。只要注意這些工具...他們生成的報告只是一個指導,而不是一個明確的TODO清單。總會有一些東西可以接受,這很可能會錯過一些東西。但是,如果你只是想要一個如何擰緊我的指標,那些工具是相當不錯的。 – Brad

+0

@AndrewLi這就是我想的;但是,我從來沒有用JS來遍歷全局或窗口屬性。 (我試圖完全使用對象或簡單的程序腳本) – KareemElashmawy

回答

1
var count = 0; 
for(var x in window){ 
    if(window.hasOwnProperty(x)) count++; 
} 
console.log(count); 
+3

'Object.keys(this).length'可能更簡單。 ;-) – RobG

+0

@RobG工作;加里的回答回來了0.請發表回答 – KareemElashmawy

+0

加里,你的回報329點擊; @ RobG's返回327. – KareemElashmawy

2

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

因此,在瀏覽器的方法來測試代碼創建的變量可能是:

  1. 伯爵全球性的「空」的文件數量,即應該是默認的主機定義集
  2. 計算可疑文檔中全局屬性的總數
  3. 使用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;