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

Pie*_*aud 7 javascript reflection scope

在JavaScript调试器中,我可以手动检查函数的作用域链.例如,在执行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 ();
Run Code Online (Sandbox Code Playgroud)

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

Chrome调试器中显示的范围变量

有没有办法以编程方式执行此操作?
如何检查每个范围级别的定义?

Tim*_*ton 7

我(很)确定这是不可能的.
甚至Chrome调试器也不会始终跟踪您的范围,但只有在它遇到断点时才会跟踪.始终跟踪范围链会花费太多内存(取决于闭包和上下文的复杂性).有关详细信息,请参阅此功能请求:https:

//groups.google.com/forum/#!topic/google-chrome-developer-tools / wKEMpKjXR7s ECMA 262(10.3.1)描述了必须如何完成标识符解析,此最重要的部分是调用GetIdentifierReference (lex, name, strict)其描述在ECMA 262(10.2.1) .据我所知,ECMAScript的任何实现中都没有命令在运行时调用此函数.

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