如何计算全局范围内的全局变量数?

时间:2017-06-07 00:31:52

标签: javascript

我正在开发一个由别人开发的项目。我加载了Chrome开发者工具来检查全局变量的状态。当我在Scope下打开Global时,我看到了大量的全局变量。滚动浏览它需要8秒钟。在这个项目上工作了一段时间后,我知道全局变量是一个我们必须解决的问题;但是,*与我的问题无关。

要传播我们的全局范围的比例,我想计算当前在全局范围内实例化的变量数

我该怎么做?

我正在寻找JavaScript中的答案,我可以立即在我的控制台中执行。基本上可以在全局范围内迭代的东西count++

2 个答案:

答案 0 :(得分:2)

我不确定全局变量的数量本身就是任何事物的有用指标。您应该进行一些分析,以确定哪些是由代码创建的,这些代码是特定于主机的,并且与环境相关(例如DOM)。

在浏览器中,窗口对象是global object的同义词,允许主机向其添加属性(例如 window.name )as以及在其原型上定义属性(如果它有一个)。

此外,所有元素ID都是作为 window 的属性创建的(你可以责怪微软和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
  4. 计算文档中的元素数

    所以代码创建的全局变量的数量应该是第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;
    

答案 1 :(得分:1)

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