我正在开发一个由别人开发的项目。我加载了Chrome开发者工具来检查全局变量的状态。当我在Scope下打开Global时,我看到了大量的全局变量。滚动浏览它需要8秒钟。在这个项目上工作了一段时间后,我知道全局变量是一个我们必须解决的问题;但是,*与我的问题无关。
要传播我们的全局范围的比例,我想计算当前在全局范围内实例化的变量数
我该怎么做?
我正在寻找JavaScript中的答案,我可以立即在我的控制台中执行。基本上可以在全局范围内迭代的东西count++
。
答案 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));
因此,在浏览器中测试代码创建变量的方法可能是:
所以代码创建的全局变量的数量应该是第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);