在功能中找到所有全局引用



我有一个JavaScript函数,我想将功能传递到另一个函数,然后:

  • 确定函数中使用的所有全局变量。
  • 确定功能中使用的所有全局函数调用。[更难]
  • 请在OBJ中返回此信息
  • 干净地做。

例如:

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()};

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

谢谢

您可以使用ESPRIMA或其他JS AST解析器将功能转换为干净的结构。然后,您可以递归分析它。它有点太大了,无法作为堆叠式流程答案写,但是简而言之,以:

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

潜入.body,然后递归分析它。寻找.type == "VariableDeclaration",其中将包含本地变量。还要查看您功能的.params,它们也是本地的。扫描时,查找.type == "Indentifier".type == "CallExpression";这些将使用变量和功能,因此请根据您的本地变量列表进行检查。您将需要在两次传球中进行,首先要收集当地人,然后再找到全球。另外,当您找到.type == "FunctionDeclaration".type == "FunctionExpression"时,您必须制定一个新的范围:将本地变量列表移动到诸如继承的当地人之类的东西,并列出一个新的当地列表,以使内部范围变量不要流血到外部范围中。

很多细节需要熨除局;您可以检查Estree项目以查看可能的节点类型。

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

最新更新