如何在Javascript中解析Javascript代码以获取不在当前作用域中的变量名称?

4
var code = 'var n = a; x = y; status.show();\n// todo: \nconsole.log(xyz, "todo: // tests.", params);';
function parse (c) {
    var myFunc = new Function("myFunc", c); 
}

我正在使用V8 NODEJS环境。因此,可能可以获取现有函数中声明变量及其作用域的信息?
实际上,我需要缺失的变量名称a、x、y、status、xyz和params。
有人能指导我正确的方向吗?
最好的问候。

不确定您想要得到什么。'eval' 是否符合您的需求?我的意思是,如果您在 'parse' 函数内调用 'eval(code)',则在 'code' 中声明的变量将成为 'parse' 的本地变量。 - accme
新功能是eval的一种形式。使用status不会在范围内声明它...但你建议我在我的示例中忘记了某些东西。所以我用x = y扩展它; :) - Stephan Ahlf
你可以使用 UglifyJS 的 JS 解析器,这里有详细描述,以正确解析你的代码。 - robertklep
2个回答

7

我建议使用类似UglifyJSesprima的解析器来解析代码,提取变量,然后在当前环境中对其进行测试。我认为这并不难,因为我已经构建了相当多的JavaScript代码分析或编译/评估。

但是,如果您需要更简单和更快速的解决方案,您也可以尝试JSLint。我们可以将其用作库,仅禁用其他规则,只保留“未定义变量”。我们可以测试当前环境中的每个错误,以查看它们是否被提供。


6

以下是使用UglifyJS进行操作的方法:

var UglifyJS = require("uglifyjs");
var parsed = UglifyJS.parse(code);
parsed.figure_out_scope();
parsed.globals.each(function(g) {console.log(g.name)});

您可以在终端中运行npm install uglifyjs,然后node尝试此操作。从问题中复制并粘贴var code = (...);部分,然后再粘贴上面的代码;这是我得到的结果:

> parsed.globals.each(function(g) {console.log(g.name)});
a
x
y
status
console
xyz
params

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接