如何以编程方式检查 JavaScript 作用域链?

How to programmatically inspect the JavaScript scope chain?

在 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 上设置断点,我看到以下范围:

有什么方法可以编程吗?
我如何检查每个范围级别定义的内容?

我(非常)确定这是不可能的。
甚至 Chrome-调试器也不会一直跟踪您的范围,但只有在遇到断点时才会跟踪。一直跟踪范围链会消耗太多内存(取决于闭包和上下文的复杂性)。请参阅此功能请求以获取更多信息:https://groups.google.com/forum/#!topic/google-chrome-developer-tools/wKEMpKjXR7s

ECMA 262 (10.3.1) describes how Identifier Resolution has to be done, the most important part of this is to call GetIdentifierReference (lex, name, strict) which is described in ECMA 262 (10.2.1)。据我所知,在 ECMAScript 的任何实现中都没有命令在运行时调用此函数。

但是 this 问题(或准确地说是答案)可能很有趣,因为它至少更接近您的要求。