在Javascript中查找全局变量的最佳方法

时间:2016-11-22 21:34:20

标签: javascript scope global-variables global

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

3 个答案:

答案 0 :(得分:4)

将window-object中的Keys与" empty"的键进行比较。窗口对象:

(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 :(得分: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/

中创建了一个这样的例子

答案 2 :(得分:-1)

试试这个......

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

这将在页面上列出所有功能和变量,可能不是非常有用,但可能会为您提供更多信息。

如果您打开Chrome开发工具,可以尝试一下。创建变量var life = 42,您将在执行上述for循环后看到它列出。