假设我知道变量被称为“myVar”,它在自调用函数中声明
(function (){
var myVar=0;
setInterval(function(){
console.log(myVar++);
}, 3000);
})();
但我不知道这个函数的调用位置,并且不想对大量的JS进行逆向工程。我想找到对这个变量的引用,所以我可以在控制台中显示它,比如window.rootObject.subObject.myVar。我试图创建一个从窗口对象执行递归搜索键的函数,但它执行stackoverflow,当然是因为循环引用(一个对象包含对其包含对象的引用)。
有没有简单的方法可以找到这个对象的位置?
编辑:原始问题是关于在全局空间中查找仅具有其名称的var,而不知道它是窗口对象的后代还是存储在EnvironementRecord中。我提供的示例代码具有误导性,因此我编辑了问题并接受了答案以使其有用。
答案 0 :(得分:2)
本地范围的变量确实是本地范围的。它们根本无法在该范围之外访问。它们不是可以通过window
对象访问的属性。
如果要使用变量调试代码,请在变量作用域的函数内设置断点(例如,通过添加debugger
语句)。
答案 1 :(得分:2)
myVar
不属于您可以获取引用的任何对象。在规范术语中,它属于EnvironmentRecord用于调用匿名函数的执行上下文的变量环境,但是没有办法直接访问该对象(可能会也可能不会< em>字面上在运行时完全存在,具体取决于所使用的JavaScript引擎的实现方式。)
您似乎相信所有对象(甚至是仅限于规范的对象,如环境记录)都在树中,并且在从某个根对象引用的路径之后是可访问的,因此在代码中以某种方式“可被发现”。这是可以理解的,但事实并非如此。当然,JavaScript引擎具有类似于垃圾收集目的的树(对于实际上在运行时创建的对象),但是没有,没有根可以从中发现可以在代码中访问的所有内容。