如何以编程方式检查JavaScript范围链?

时间:2015-02-19 07:43:52

标签: javascript reflection scope

在JavaScript调试器中,我可以手动检查函数的scope chain。例如,在这段代码上执行foo()时:

var x1 = "global";
var foo = (function main () {
    var x2 = "inside obj";
    return function internalFoo () {
        var x3 = "inside internalFoo";
        console.log (x1+','+x2+','+x3); // get the scopes
    };
})();
foo ();

并在console.log上设置断点,我看到以下范围:

Scope Variables seen in Chrome Debugger

是否有一些方法可以以编程方式执行此操作? 如何检查每个范围级别定义的内容?

1 个答案:

答案 0 :(得分:6)

我(非常)确定这是不可能的。
即使是Chrome调试器也不会始终跟踪您的范围,但只有当它遇到断点时才会跟踪。始终跟踪范围链会花费太多内存(取决于闭包和上下文的复杂性)。有关详细信息,请参阅此功能请求:https://groups.google.com/forum/#!topic/google-chrome-developer-tools/wKEMpKjXR7s

ECMA 262 (10.3.1)描述了如何完成标识符解析,其中最重要的部分是调用ECMA 262 (10.2.1)中描述的GetIdentifierReference (lex, name, strict)。据我所知,ECMAScript的任何实现中都没有命令在运行时调用此函数。

然而this问题(或者确切地说是它的答案)可能很有趣,因为它至少更接近你的要求。