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

9
在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 ();

console.log 上设置断点后,我看到以下作用域:

在 Chrome 调试器中看到的作用域变量

有没有一些方法可以以编程方式实现这个功能?
如何检查每个作用域级别定义的内容?

1个回答

9
我可以确定,这是不可能的。即使Chrome调试器也不能一直跟踪您的作用域,只有在遇到断点时才会跟踪。始终跟踪作用域链将耗费太多内存(取决于闭包和上下文的复杂性)。有关更多信息,请参见此功能请求ECMA 262(10.3.1)描述了如何执行标识符解析,其中最重要的部分是调用GetIdentifierReference(lex,name,strict),该函数在ECMA 262(10.2.1)中进行了描述。据我所知,在任何ECMAScript实现中,都没有命令可以在运行时调用此函数。
但是这个问题(或者准确地说是它的答案)可能很有趣,因为它至少接近了您所要求的结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接