在node.js或V8中获取闭包的所有值

例如,如果我们假设下面的代码:

var f = function() { return 'hello world' }; var x = 10; var y = 314; var g = function() { var buf = [], xx = x; while (xx--) buf.append(f() + ' '); return buf.join(''); } 

我可以用g.toString()来获得实际的“code”作为g的string。 但是,这并不(显然)得到fx的closuresg (抱歉,如果我不正确地使用这些条款)。

有什么方法来查询它的闭包含有什么function? 理想情况下,我可以得到一个对象:

 { 'f' : f, 'x': x } // note that `y` is not here 

如果我不得不放入C ++与V8进行特殊的交互,那没关系,尽pipe在纯JavaScript中做这个事情是最好的。


我知道这是一个奇怪的问题,但是我有一个合理的理由要这个!

我发现这个关于 V8闭包实现的讨论很有启发。 这听起来像你正在寻找的C ++对象是一个上下文 。

你想拥有一个在该函数内使用的所有variables的列表,对吧? 快速和肮脏的方法可能是使用像UglifyJS的parsing器和AST的东西走的function,这样你就可以得到所有variables的列表等等。

编辑:

这种方法不存在。 如果你用JavaScript来做这件事,那么你最好的办法就是编写一个parsing器来确定一个函数closures的variables。

如果你写这样的方法,请分享:)

原文:

在你的例子中,闭包g可以访问fyx被声明为局部variables,所以x不等于10.没有一个特殊的方法可以告诉你函数closures了什么variables。

如果g是对象的方法,则可以使用对象的hasOwnProperty函数来确定对象可用的属性。 AFAIK是唯一接近确定函数在JavaScript中访问哪些variables的函数。

您发布的代码中没有closures。 你可以随时获得你想要的任何variables的值,这就是你的g函数所能看到的。 仅仅因为你在另一个函数中调用了一个函数,并不会产生结果。 要有一个闭包,f必须是g函数作用域的variables,而不是。 这两个函数都和你的x和y相同,大概是全局的。 如果你说要将整只小狗包装成一个更大的函数,它们将仍然在相同的范围内,但是如果你要从一个包含函数中返回f和g, 那么你将看到一个闭包,其中x和y会返回函数是私有的,与f和g共享。 那么你将需要某种forms的getter函数,这个函数也需要被返回,并且可以通过在范围链中将一个观测variables的值设置为一个链接来进行通信。

就目前来看,随着代码的提出,x是x和y是为什么,在任何时候检查它们,这是他们的价值,这也是f和g会看到的。

Ricky Gee

正如Ricky Gee所说,这里没有问题,因为variables都是全局的,所以你可以通过全局对象来获取它们。 但是,如果我们假设代码不是全局的,那么不可以从g的闭包中提取对variablesf,x和y(或它们的值)的引用。

你不能用JavaScript来做,而且你不能通过V8 API来完成。 显然,数据是在某个地方,但V8甚至不尝试使其内部数据结构可用。