我知道,例如,当Chrome下载Javascript文件时,会对其进行解释和JIT。
我的问题是,当IE6,7,8首先下载一个Javascript文件时,整个事情是解析和解释的吗?
我的理解是,只有顶级函数签名和在全局范围内执行的任何内容都在加载时进行了解析。然后在执行时解析函数体和其余部分。
如果在加载时对它们进行了完全解析,您认为延迟下载和解析函数体的时间节省了多少?
答案 0 :(得分:5)
它们在加载时被完全解析。 (当然,IE必须解析脚本以了解每个函数体的结束位置。)在开源实现中,每个函数都被编译为字节码,甚至同时编译为机器代码,我想IE的工作方式是一样的
如果您的页面实际上加载速度太慢,并且您可以推迟加载可能不会使用的100K脚本,则可能会有助于您的加载时间。或者不 - 请参阅下面的更新。
(Trivia:像Sunspider这样的JS基准测试通常不会测量解析和编译代码所需的时间。)
更新 - 自从我发布此答案后,情况发生了变化!实现仍会在加载时解析每个脚本,至少足以检测标准所要求的任何语法错误。但他们有时会推迟编译函数,直到他们第一次被调用。
答案 1 :(得分:3)
因为定义一个函数实际上是一个操作,是的,你的整个javascript文件都被解析了,所有的顶层操作都被解释了。函数内部的代码在被调用之前并没有实际执行,但是它被解析了。
例如:
var i=0;
var print = function( a ) {
document.getElementById( 'foo' ).innerHtml = a;
}
在上面的示例中,所有内容都被解析,第1行和第2行被执行。但是,第3行在被调用之前不会被执行。
您可以与用户一起玩很少的“感知游戏”,例如将脚本标记放在HTML的底部而不是顶部,以便浏览器在收到说明之前呈现页面的顶部下载并解析javascript。您可能还可以将函数定义推送到document.onload函数中,以便在整个页面加载到内存之后才能执行它们。但是,如果您的javascript将视觉样式应用于某些内容(例如jQuery UI内容),这可能会导致“无格式内容的闪现”。
答案 2 :(得分:2)
是的,在所有浏览器上,如果使用<script>
标记,资源的下载会阻止页面上的所有其他内容(CSS下载,其他JS下载,渲染)。
如果您在开头或整个页面加载所有javascript,您将看到打嗝,因为请求大约是50毫秒,并且对库文件或类似内容的解析可能超过100毫秒。 100ms被用作标准,其中任何更大的内容将被用户注意为“滞后”。
节省的时间可以忽略不计,但如果您的网页加载时暂停,则用户体验会略有下降,这可能会因您的具体情况而异。
有关延迟加载和解析的好处的大量文章和很好的解释,请参阅LABjs' site。
答案 3 :(得分:1)
“下载”是什么意思?当它包含在标签中,或者通过XMLHttpRequest下载时?
如果您的意思是包含脚本,那么IE会立即解释所有js文件。否则,您将无法调用该文件中的函数或查看语法错误消息。
如果您的意思是通过XMLHttpRequest下载,那么您必须自己评估文件的内容。