查找函数中的所有全局引用?

时间:2015-05-01 03:21:14

标签: javascript function global-variables

我有一个javascript函数,我想将该函数传递给另一个函数然后:

  • 识别函数中使用的所有全局变量。
  • 标识函数中使用的所有全局函数调用。 [哈德]
  • 在对象中返回此信息。
  • 干净利落地做。

例如:

function foo() {
    var a; // ignored
    global = 2; // want 'global'
    bar(global); // want 'bar'
};

var obj = identifier(foo); // Need to write this function 'identifier'! :)
console.log(obj); // Produces: {globar:2, bar = bar()};

注意:我正在寻找一种干净的方式。我曾考虑将函数转换为字符串,解析每一行并处理它。我觉得这可能不是一个简单的证据计划,会有更好的方法。如果没有更好的方法,我会回来分享我的解决方案。

谢谢

1 个答案:

答案 0 :(得分:2)

您可以使用Esprima或其他JS AST解析器将该函数转换为干净的结构。然后你可以递归地分析它。写一个StackOverflow答案有点太大了,但简而言之,从:

开始
var ast = esprima.parse(foo);

潜入.body,并递归分析它。查找将包含局部变量的.type == "VariableDeclaration"。另请查看您的函数的.params,这些也是本地的。在您扫描时,请查找.type == "Indentifier".type == "CallExpression";那些将使用变量和函数,因此请根据您的局部变量列表进行检查。您将需要两次通过,首先收集本地,然后找到全局。此外,当您找到.type == "FunctionDeclaration".type == "FunctionExpression"时,您必须创建一个新范围:将局部变量列表移动到类似继承的本地,并创建一个新的本地列表,以便内部范围变量不要流入外围。

需要解决许多细节问题;您可以检查ESTree项目以查看可能的节点类型。

最后,我暂时同意zerkms:除非您正在编写编辑或类似内容,否则这可能是一个XY问题。