通过 Chrome DevTools API 或面板以编程方式访问 [[Scopes]](闭包变量)?(不在断点处)

Programmatically accessing [[Scopes]] (closure variables) through Chrome DevTools API or panel? (Not at breakpoint)

提问人:cxw 提问时间:9/3/2018 最后编辑:cxw 更新时间:9/3/2018 访问量:2940

问:

在 2014 年,JS 代码无法从闭包外部访问闭包内部的变量。从那时起,Chrome 的内部已更改为 use 而不是 .[[Scopes]]Closure

现在(2018 年)Chrome DevTools 是否可以以编程方式读取?如果是这样,是否有现有的 DevTools 扩展可以这样做?[[Scopes]]

用例:检查使用 RequireJS 加载的 UMD 模块中的变量。我知道我可以使用面板在断点或语句处执行此操作,但即使我不在断点处,我也希望能够这样做。debuggerScopes

编辑截至 2017 年,无法访问 [[FunctionLocation]],但我不知道.[[Scopes]]

尝试

我已经调查了以下内容但没有成功(模块工厂函数名称):main

  • 此注释提到了 ,但无法以编程方式访问 的输出。我可以手动使用然后扩展结果,但不能以编程方式扩展。console.dir()console.dir()console.dir({main})
  • 在 DevTools 控制台中,我可以按使用。这让我更接近,但不是:inspect({function})[[Scopes]]

    > var x = inspect({main})
    > x.main.name
    ← "main"
    > x.main[Symbol('Scopes')]
    ← undefined
    > x.main['[[Scopes]]']
    ← undefined
    
  • chrome.devtools.inspectedWindow API 提供了一个可以使用 inspect eval 方法。但是,如上所述,我无法从结果中得到 。inspect[[Scopes]]

笔记

  • 发布一个新问题,而不是像这个 Meta 答案所建议的那样,在 2014 年提出一个问题
  • 这个问题不同,因为我正在尝试访问模块内部而不是公共模块接口
JavaScript Google-Chrome 闭包 google-chrome-devtools 检查

评论

0赞 Jonas Wilms 9/3/2018
stackoverflow.com/questions/41146373/......
0赞 cxw 9/3/2018
@JonasWilms 谢谢 - 我确实看到了那个,但忘记在问题中链接它。在访问权限方面和访问权方面有什么区别吗?[[FunctionLocation]][[Scopes]]
1赞 Bergi 9/3/2018
您仍然无法以编程方式访问它们(从页面或控制台中的代码)。他们更改了显示该内部属性的名称并不会更改任何内容。
0赞 Bergi 9/3/2018
但是,devtools 扩展可能能够做到这一点。这就是你想创造的吗?
1赞 Bergi 9/4/2018
@cxw devtools API 确实令人失望。它似乎非常受限制,只允许轻度自定义,例如获取当前检查的窗口并将自己的面板添加到 devtools 视图,但无法访问内部数据结构。看来您应该专注于调试器 API,它允许您访问运行时对象,并访问内部属性

答: 暂无答案