javascript - 在函数中查找所有全局引用?

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

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

谢谢

最佳答案

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

var ast = esprima.parse(foo);

深入.body,递归分析它。查找将包含局部变量的 .type == "VariableDeclaration"。还要查看函数的 .params,它们也是本地的。在您扫描时,查找 .type == "Indentifier".type == "CallExpression";这些将使用变量和函数,因此请根据您的局部变量列表检查它们。您将需要分两次完成,首先是收集本地人,然后是寻找全局人。此外,当您找到 .type == "FunctionDeclaration".type == "FunctionExpression" 时,您必须创建一个新的作用域:将局部变量列表移动到某物中像继承的局部变量一样,并创建一个新的局部变量列表,以使内部作用域变量不会渗入外部作用域。

很多细节需要解决;你可以查看ESTree项目以查看可能的节点类型。

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

关于javascript - 在函数中查找所有全局引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29981209/

相关文章:

matlab - 将 bsxfun 应用于具有多个输出参数的函数

javascript - CSS 未被另一个函数调用的函数使用

java - 我应该导入数学库吗?如果是的话如何导入?

r - 我们如何在构建 R 包时设置常量变量?

android - 在 Android/Java 中将全局对象实现为单例或 DataClass 的优缺点

javascript - ng-view 在 angularjs 中不起作用

javascript - 防止动画期间单击事件

javascript - 命令行的输入在什么时候被解析成node.js中的process.argv?

javascript - 使用 Map 创建频率图 - JavaScript

c - 使用 nftw 时如何避免使用全局变量