2011-01-31 21 views
20

假设我们做这样的事情(如JavaScript对象的建设的一部分):如何检查JavaScript中的绑定闭包变量?

var foo = 3; 
this.method = function() { alert(foo); }; 

现在关闭将产生以确保foo被保留,可用于method。有没有一种方法可以对当前的封闭进行反思?

我在找的是一种枚举method内可用的所有变量的方法,其中应包括foo。像这样调试代码将大大有助于调试闭包的绑定,但我还没有找到它。是否有可能做到这一点?

回答

10

该语言本身不包含这样的可能性。事实上,隐藏在JavaScript闭包中的数据是真正私有的(与C#,C++,Java等中的“私有”数据相反,它总是可以通过指针魔术或反射来访问)的少数几件事之一。

总之,这将是一个编译器级的事情。你可能希望的是一个主要的JavaScript解释器内置的工具(或者至少内置将这种工具插入到核心引擎中的功能)。一个在Firefox/Firebug或V8/Node.js会很好,但我相信我们目前运气不佳。

7

自1.11.2开始,Firebug的命令行包含语法扩展名,用于获取foo的值:this.method.%foo

通过打开DOM面板中的“Show Closures”选项并展开this.method的“(闭合)”伪属性,也可以检查整个闭包。这也适用于Chrome(其中伪属性被称为<function scope>;它没有优先权)。

0

也许JavaScript没有默认实现它,但我可以想象一种方式来读取全局对象中的所有属性(因为foo是它的一个属性)并读取每个属性直到关闭,尽管这样会很慢。我必须说我对JavaScript没有多少了解,也许我只是说非官方,但也许你会从我的方法中得到一个新的想法。

+1

如果`foo`是一个局部变量(也许OP的例子全部在构造函数内),那么它将无法从全局对象中获得。 – dpercy 2016-02-20 00:12:23