我有一个 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/