代码之家  ›  专栏  ›  技术社区  ›  Adam

加载时是否解析/解释了javascript?(IE)

  •  8
  • Adam  · 技术社区  · 15 年前

    我知道,例如,当chrome下载一个javascript文件时,它会被解释和抖动。

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

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

    如果它们在加载时被完全解析,那么您认为延迟要下载和解析的函数体会节省多少时间呢?

    4 回复  |  直到 11 年前
        1
  •  2
  •   James van Dyke    15 年前

    是的,如果使用 <script> 标签。

    如果您在开始或整个页面加载所有的javascript,您会看到一个请求出现的打嗝大约是50毫秒,对库文件或类似文件的解析可能超过100毫秒。100毫秒被用作标准,用户会注意到任何更大的内容都是“滞后”。

    节省的时间可以忽略不计,但是如果页面加载时出现停顿,则用户体验的轻微损失可能会非常严重,具体取决于您的情况。

    LABjs' site 关于延迟加载和解析的好处有很多文章和很好的解释。

        2
  •  5
  •   Jason Orendorff Oliver    11 年前

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

    如果你有一个页面加载得太慢,你可以推迟加载100K你可能不会使用的脚本,这可能会帮助你的加载时间。或者不见下面的更新。

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

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

        3
  •  3
  •   Martijn Laarman    15 年前

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

    例如:

    var i=0;
    var print = function( a ) {
      document.getElementById( 'foo' ).innerHtml = a;
    }
    

    在上面的示例中,所有内容都被解析,第1行和第2行被执行。但是,在调用第3行之前,它不会被执行。

    你可以和你的用户玩一些“感性的游戏”,比如把脚本标签放在HTML的底部而不是顶部,这样浏览器就可以在收到下载和解析javascript的指令之前呈现页面的顶部。您也可以将函数定义推送到document.onload函数中,这样在整个页面加载到内存中之前,它们就不会被执行。但是,如果您的javascript将视觉样式应用于事物(如jquery ui东西),这可能会导致“非样式内容的闪现”。

        4
  •  1
  •   nemisj    15 年前

    “下载”是什么意思?当它包含在标记中,或者当它通过xmlhttprequest下载时?

    如果您的意思是通过脚本包含,那么IE一次解释所有JS文件。否则,您将无法调用该文件中的函数或查看语法错误消息。

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