Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否查找函数中的所有全局引用?_Javascript_Function_Global Variables - Fatal编程技术网

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

我有一个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解析器将函数转换为干净的结构。然后你可以递归地分析它。作为StackOverflow答案写起来有点太大了,但简而言之,从以下开始:

var ast = esprima.parse(foo);
潜入
.body
,并递归地分析它。查找将包含局部变量的
。type==“VariableDeclaration”
。还可以查看函数的
.params
,它们也是本地的。扫描时,查找
.type==“indicator”
.type==“CallExpression”
;这些将使用变量和函数,因此请对照您的局部变量列表检查它们。您需要分两步完成,首先收集本地人,然后查找全球人。此外,当您发现
.type==“FunctionDeclaration”
.type==“FunctionExpression”
时,您必须创建一个新的作用域:将局部变量列表移动到类似继承的局部变量的位置,并创建一个新的局部变量列表,以便内部作用域变量不会流入外部作用域

很多细节需要解决;您可以检查project以查看可能的节点类型


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

我认为没有其他方法,您必须将其转换为字符串。javascript函数对内部使用的变量/函数没有编程访问权。您必须将其作为字符串传递并解析字符串。原始任务是什么?这个解决方案看起来很脏。这太神奇了。非常感谢。今天就开始,可能需要一点时间。我会发布我的结果。我正在编写一个nodejs模块,并将使用很长的篇幅,以使API语法易于使用且符合逻辑。