的Debugger.scriptParsed
事件是什么产生scriptId
每个找到脚本。解析的每个脚本文件都会触发该事件,并且应该收到一个唯一的ID。除个别脚本文件外,页面源中的每个<script>
标记实例也将获得其自己的标识。
事件回调传递的参数有很多。您可以通过注销arguments
对象来检查所有参数。例如,对于脚本文件,您将得到url
,而startLine
将为出现在HTML资源中的<script>
标记给出偏移量。
on('Debugger.scriptParsed', function() {
console.log(JSON.stringify(arguments, null, 2)(
});
调查
在回答你的问题的更新,我的理解是,在调试模式下,它会尝试一个完整的解析,而不是试图用一个预先解析优化。我无法真正了解v8代码库,但我做了一些测试。
我用一个按钮和一个单独的脚本文件创建了一个HTML页面。我在页面加载后立即执行了一个函数。另一个功能是在点击按钮上执行的。
document.addEventListener("DOMContentLoaded",() => {
document.getElementById('clickMe').addEventListener('click',() => clicked);
});
我检查了Debugger.scriptParsed
的输出。它立即解析了脚本文件。点击按钮后,没有其他输出条目。如果我更改处理程序以调用eval
动态调用clicked
,它确实输出了一个新的脚本块。
eval('clicked()');
这很有意义,因为解析器在执行之前无法知道它。这同样适用于内联处理程序,例如, onclick="doSomething()"
我注意到的其他块是来自chrome的Chrome扩展URI和内部URI。
此函数仅[通过id提取脚本](https://cs.chromium.org/chromium/src/v8/src/inspector/v8-debugger-agent-impl.cc?l=662&rcl=f212dbeaa1c0b0c97ef1d01c4cf61a2d920157b8) 。所以问题是V8引擎如何分配一个你可能从源代码中推断出的ID。 – wOxxOm