2017-06-07 363 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;