Javascript是否在加载时进行分析/解释?(即)

Javascript是否在加载时进行分析/解释?(即),javascript,performance,internet-explorer,Javascript,Performance,Internet Explorer,例如,我知道当Chrome下载Javascript文件时,它会被解释和JIT 我的问题是,当IE6、7、8第一次下载Javascript文件时,整个过程都被解析和解释了吗 我的理解是,只有顶级函数签名和在全局范围内执行的任何内容在加载时被解析。然后在执行时解析函数体和其他函数体 如果它们是在加载时完全解析的,您认为推迟函数体的下载和以后的解析会节省多少时间?它们是在加载时完全解析的。(当然,IE必须解析脚本才能知道每个函数体的结束位置。)在开源实现中,每个函数都被同时编译成字节码甚至机器码,我认

例如,我知道当Chrome下载Javascript文件时,它会被解释和JIT

我的问题是,当IE6、7、8第一次下载Javascript文件时,整个过程都被解析和解释了吗

我的理解是,只有顶级函数签名和在全局范围内执行的任何内容在加载时被解析。然后在执行时解析函数体和其他函数体


如果它们是在加载时完全解析的,您认为推迟函数体的下载和以后的解析会节省多少时间?

它们是在加载时完全解析的。(当然,IE必须解析脚本才能知道每个函数体的结束位置。)在开源实现中,每个函数都被同时编译成字节码甚至机器码,我认为IE的工作方式是相同的

如果您有一个页面实际加载速度太慢,并且您可以延迟加载可能不使用的100K脚本,这可能有助于缩短加载时间。或者看不到下面的更新

(琐事:像Sunspider这样的JS基准通常不会测量解析和编译代码所需的时间。)


更新–自从我发布了这个答案后,一切都变了!按照标准的要求,实现仍然在加载时解析每个脚本,至少足以检测任何语法错误。但是它们有时会推迟编译函数,直到第一次调用它们。

是的,在所有浏览器上,如果使用
标记完成,则资源的下载会阻止页面上的所有其他内容(CSS下载、其他JS下载、渲染)

如果您在页面开始或整个页面中加载所有javascript,您将看到一个中断,因为请求大约为50ms,对库文件或类似文件的解析可能超过100ms。100ms作为标准,用户会注意到任何更大的延迟

节省的时间可能可以忽略不计,但如果页面加载时出现暂停,用户体验的轻微损失可能会很大,具体取决于您的情况


有关延迟加载和解析的好处的大量文章和精彩解释,请参阅。

因为定义函数实际上是一个操作,是的,整个javascript文件都会被解析,所有顶级操作都会被解释。函数中的代码在被调用之前不会实际执行,但会被解析

例如:

var i=0;
var print = function( a ) {
  document.getElementById( 'foo' ).innerHtml = a;
}
在上面的示例中,所有内容都被解析,第1行和第2行被执行。但是,第3行在被调用之前不会被执行

您可以与用户玩一些“感知游戏”,比如将脚本标记放在HTML的底部而不是顶部,这样浏览器就可以在收到下载和解析javascript的指令之前呈现页面的顶部。您可能还可以将函数定义推入document.onload函数中,以便在整个页面加载并存储在内存中之前不会执行这些函数定义。但是,如果您的javascript将视觉样式应用于事物(如jQuery UI内容),这可能会导致“未样式化内容的闪现”。

您所说的“下载”是什么意思?当它包含在标签中,或者通过XMLHttpRequest下载时

如果你指的是脚本包含,那么IE会一次解释所有js文件。否则,您将无法调用该文件中的函数或看到语法错误消息


如果您的意思是通过XMLHttpRequest下载,那么您必须自己评估文件的内容。

通过解释,您的意思是它们被执行了?是的。我不相信InternetExplorerJIT。如果这是正确的,那很有趣。我认为他们会在下一次调用函数时,出于性能原因而进行一些jitting。我想纯解释速度慢的想法已经过时了。我的意思是纠正:V8从不解释,它总是编译成本机代码。它甚至没有解释器,只有一个本机代码编译器。@Jörg W Mittag是的,我想我是在切题:parse/exploration/execute。这两者本质上是相同的:解释/执行。请注意,Parser类是一个模板,它可以生成一个AST,用于立即编译(
Parser
),也可以只检测语法错误(
Parser
)。当在运行时调用尚未编译的函数时,将调用
js::frontend::CompileLazyFunction