2016-11-22 66 views
0

我继承了一个项目,看起来有很多变量会污染全局范围,我想要找到所有这些变量。找到用户引入的全局变量的最佳方法是什么?我想排除默认情况下窗口对象上的属性,只需筛选出已由我们的代码引入的属性。是否有工具或IDE插件可以让我轻松识别这些内容?由于在Javascript中查找全局变量的最佳方法

+0

我认为jslint会警告未声明为本地的变量。它可能会产生标准窗口属性的误报,但不应该很难忽略它们。 – Barmar

+0

这是SO [post1]上的几个帖子(http://stackoverflow.com/questions/17276206/list-all-js-global-variables-used-by-site-not-all-defined)[post2]( http://stackoverflow.com/questions/8369338/javascript-dumping-all-global-variables) –

回答

3

在窗口对象比较钥匙用“空”窗口对象的键:

(function(){ 
    var iframe = document.createElement('iframe'); 
    iframe.src = "about:blank"; 
    document.body.appendChild(iframe); 

    var windowVars = Object.keys(iframe.contentWindow); 
    var globalVars = Object.keys(window).filter(key => !windowVars.includes(key)); 

    console.log("global Vars:", globalVars); 
    document.body.removeChild(iframe); 
})(); 

现在你必须搜索你的代码来找到他们声明的行。

-1

尝试......

for(var stuff in window) { 
    if(window.hasOwnProperty(stuff)) console.log(stuff); 
} 

这将列出在页面上所有的函数和变量,可能不是超级有用的,但可能会给你一些更多的信息。

如果你打开Chrome开发工具,你可以尝试一下。创建一个变量var life = 42,执行上面的for循环后,你会看到它被列出。

1

获取一个窗口对象实例:https://jsfiddle.net/noevgh4u/

对象实例的比较:https://jsfiddle.net/noevgh4u/1/

我能想到的办法是,开放在你所选择的浏览器中的空白页,最实用的方法,写出来的基于该窗口属性的对象。

document.body.append("var obj = {"); 
for(prop of Object.keys(window)) { 
document.body.append(prop +": null"); 
}; 
document.body.append("}"); 

在该示例中,从页面上的文本复制该对象。

将它粘贴到您正在检查全局变量的应用程序中。

创建使用

var newObj; 
for(prop of Object.keys(window)) { 
newObj[prop] = null; 
}; 

,使应用程序中的新的对象,你现在有的OBJ包含一个空白Windows键和newObj包含应用程序键。

然后使用一种方法,例如Deep comparison of objects/arrays

什么比较两个相似:

function filterKeys(a, b) { 
var firstKeys = Object.keys(a); 
var secondKeys = Object.keys(b); 
var missingKeys = firstKeys.filter(val => !secondKeys.includes(val)); 
return missingKeys; 
} 
var createdVarsAndFuncs = filterKeys(obj, newobj); 

我的jsfiddle创造了这样一个例子https://jsfiddle.net/noevgh4u/1/

相关问题