一、现象描述
在Chrome的开发者工具中,你可能会看到一些以“VM”开头的JavaScript文件(如“VM111.js”)。
二、VM文件到底是什么?
“VM”表示的是Virtual Machine(虚拟机),这些文件通常表示由浏览器生成和执行的虚拟机脚本环境中的临时脚本。这些脚本并不是项目源代码的一部分,也不是实际存在的物理文件。 它们在浏览器的内存中创建并执行。
三、它有什么用?
比如说,当你在调试一个网页时,如果在某些动态生成并执行的JS代码上设定了断点,Chrome调试器会在一个以"VM"开头的文件中显示这些代码,例如"VM111.js"。这个"VM"文件的存在只是为了调试目的,它并不存在于服务器端,也不会被存储在本地,而是存在于浏览器内存中。一般情况下,这类文件的出现是因为浏览器对JavaScript代码的处理方式,如动态编译或者JavaScript堆栈跟踪。
四、它出现的原因
(1)动态执行的JavaScript代码
比如通过eval函数或者new Function方法,Chrome浏览器会创建一个"VM"文件来展示这段临时执行的代码
比如某个网页因为反爬虫,动态生成了debugger,这些断点并没有直接写在服务器上的原始JavaScript文件中,而是在某些JavaScript代码的执行过程中被生成,并因此触发debugger。
这些代码也会在执行时被浏览器视为临时的VM脚本,并在执行到debugger时暂停执行,从而造成所谓的“无限debugger循环”。
(2)来自执行栈的代码
有时候,当JavaScript引擎处理异步操作(例如Promise、setTimeout等)中的错误时,错误堆栈可能包含到VM脚本的引用,这是因为内部错误回调函数是在虚拟环境中执行的。