如何检测javascript函数的变量依赖关系

如何检测javascript函数的变量依赖关系,javascript,compilation,Javascript,Compilation,假设我有这个功能: function test(){ return a + b + 1; } 我如何动态地确定它需要全局a和全局b才能运行?例如,get_dependencies(test)返回['a','b']如果您试图使用JavaScript本身,那么在标准JavaScript中没有内置的方法来实现这一点 在几乎所有(但不是所有)JavaScript引擎上,您可以从函数对象的到字符串函数获取函数源的一种形式,例如: var testSource = test.toString();

假设我有这个功能:

function test(){
    return a + b + 1;
}

我如何动态地确定它需要全局a和全局b才能运行?例如,
get_dependencies(test)
返回
['a','b']

如果您试图使用JavaScript本身,那么在标准JavaScript中没有内置的方法来实现这一点

在几乎所有(但不是所有)JavaScript引擎上,您可以从函数对象的
到字符串
函数获取函数源的一种形式,例如:

var testSource = test.toString();
…然后你当然可以解析它。这是一种非标准行为(对函数调用
toString
的结果是),但它得到了广泛支持。您仍然需要进行解析才能找到符号


对于解析,您有两个选项。您可以尝试将的解析器部分从其余部分中分离出来,或者另一种方法是,命名非常糟糕的压缩器有一个完整的JavaScript解析器,该解析器已经与压缩器部分分离(请参阅parse-js.js;显然,您可能需要删除一些特定于NodeJ的内容).

您可以使用Javascript“lint”工具来测试代码是否存在常见错误或奇怪之处

有些可以在网上找到:

  • (也可下载)

例如,在您的情况下,您可能希望通过正则表达式隔离单个函数,并将它们提交给这样的工具。

FWIW、
a
b
不必是全局函数,它们只需在包含范围(可能不是全局范围)中定义即可我不认为这是可能的。我可以试试看——我猜有一个正则表达式并不太复杂,可以涵盖90%的案例,这对我来说已经足够了。@Trindaz:你是正则表达式:可能不太复杂。考虑注释的复杂性(它们的两种样式)、字符串文字(它们的两种样式)、正则表达式文字等。一个简单的正则表达式,例如,所有的标识符都会被这些东西炸毁。不过,通过一些预处理,你可能会得到90%的解决方案…@Trindaz:在解析的答案中添加了一些注释。