在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
上设置断点,我看到以下范围:
是否有一些方法可以以编程方式执行此操作? 如何检查每个范围级别定义的内容?
答案 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问题(或者确切地说是它的答案)可能很有趣,因为它至少更接近你的要求。