如何用静态代码分析显示所有JavaScript个全局变量?

How to display all JavaScript global variables with static code analysis?

我知道我可以输入 Chrome 或 FF 以下命令:

Object.keys(window);

但这会显示 DHTMLX 内容以及我不感兴趣的函数名称。它不会显示尚未执行的函数中的变量。我们有 20,000 多行 JavaScript 代码库,所以我更喜欢静态代码分析。我找到了JavsScript Lint。这是一个很棒的工具,但我不知道如何使用它来显示全局变量。

所以我正在搜索内存泄漏、遗忘 var 关键字等...

捕获未声明变量的一个好方法是将 'use strict' 添加到您的代码中。

错误将出现在控制台中,或者您可以将它们显示在 try ... catch 块中:

'use strict';
try {
  var i= 15;
  u= 25;
} catch(ee) {
  alert(ee.message);
}

要 [只] 做您所要求的,我想您正在寻找这个:

for each (obj in window) {
    if (window.hasOwnProperty(obj)) { 
        console.log(obj);
    }
}

我没有检查代码,这与我不同,但你明白了。尝试先设置一些内容 (var spam = "spam";),您会在控制台上看到它的报告,并且 不是 您要求避免的问题。

也就是说,例如 ; JSLint executes JavaScript in your browser without "phoning home", so feel free to run it. There are also many offline tools for JSLinting your code. I use a plugin for Sublime Text

如果您想要一些最简单的 html/JavaScript 代码到 "wrap" JSLint,我有一个示例 here. Just download the latest jslint.js file from Crockford's repository into the same directory, and poof, you're linting with a local copy of JSLint.js. Edit: Added code in a new answer here

尽管了解 当您访问 JSLint.com. Honestly, I can say with some confidence, Crockford would rather not see our code. ;^) You download JSLint.js (actually webjslint 时,您正在本地使用该包装器 进行 linting,一些文件的缩小编译)来自JSLint.com,但是你在浏览器中执行。

(诚然,您在技术上是正确的——您永远不知道该站点何时会受到损害,并且要完全恢复正常,您 sh/c/ould 兽医 jslint.js 每次你抓取一个新的副本。在本地 运行 更安全,但在撰写本文时,你似乎可以安全地使用 JSLint.com。只需盯着你最喜欢的浏览器的网络选项卡,同时 运行宁一些测试,非专有代码,看看是否有任何电话发生。或者拔下你的盒子的网络电缆!)

to use "use strict"; 是另一个很好的建议。

我找到了一个非常好的解决方案,可以使用 jsl 命令行工具列出所有全局变量:

Here is the documentation

我只需要将 /*jsl:option explicit*/ 放入我要检查的每个文件中。那就够了 运行 ./jsl -process <someFile> | grep 'undeclared identifier'

也可以使用 referenceFile,其中包含一些有意的全局变量 /*jsl:import <referenceFile>*/,因此不会列出这些变量。