Javascript 是否查找函数中的所有全局引用?
我有一个javascript函数,我想将该函数传递给另一个函数,然后:Javascript 是否查找函数中的所有全局引用?,javascript,function,global-variables,Javascript,Function,Global Variables,我有一个javascript函数,我想将该函数传递给另一个函数,然后: 确定函数中使用的所有全局变量 识别函数中使用的所有全局函数调用。[更难] 在obj中返回此信息 干净利落地做这件事 例如: function foo() { var a; // ignored global = 2; // want 'global' bar(global); // want 'bar' }; var obj = identifier(foo); // Need to write
- 确定函数中使用的所有全局变量
- 识别函数中使用的所有全局函数调用。[更难]
- 在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解析器将函数转换为干净的结构。然后你可以递归地分析它。作为StackOverflow答案写起来有点太大了,但简而言之,从以下开始:
var ast = esprima.parse(foo);
潜入.body
,并递归地分析它。查找将包含局部变量的。type==“VariableDeclaration”
。还可以查看函数的.params
,它们也是本地的。扫描时,查找.type==“indicator”
和.type==“CallExpression”
;这些将使用变量和函数,因此请对照您的局部变量列表检查它们。您需要分两步完成,首先收集本地人,然后查找全球人。此外,当您发现.type==“FunctionDeclaration”
或.type==“FunctionExpression”
时,您必须创建一个新的作用域:将局部变量列表移动到类似继承的局部变量的位置,并创建一个新的局部变量列表,以便内部作用域变量不会流入外部作用域
很多细节需要解决;您可以检查project以查看可能的节点类型
最后,我暂时同意zerkms的观点:除非您正在编写编辑器或类似的东西,否则这可能是XY问题。我认为没有其他方法,您必须将其转换为字符串。javascript函数对内部使用的变量/函数没有编程访问权。您必须将其作为字符串传递并解析字符串。原始任务是什么?这个解决方案看起来很脏。这太神奇了。非常感谢。今天就开始,可能需要一点时间。我会发布我的结果。我正在编写一个nodejs模块,并将使用很长的篇幅,以使API语法易于使用且符合逻辑。