我有一个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:除非您编写编辑器或类似的内容,否则这可能是一个问题。