javascript函数调用是否在整个脚本完成解析之前运行?

javascript函数调用是否在整个脚本完成解析之前运行?,javascript,parsing,execution,Javascript,Parsing,Execution,我知道Javascript按顺序执行代码。但是,我总是试图确定是否有任何代码在每个函数编译执行后立即“一行接一行”运行,或者脚本中的所有立即函数调用是否在实际运行之前等待整个脚本完成解析 我想更好地理解javascript解析和执行代码的方式。主要用于外部脚本,这在控制台日志中似乎有点难以观察 一个适用的用途是尝试在外部脚本中尽早截取“interactive”document.readyState,因为“interactive”状态有时会很早触发。根据否。脚本标记的整个内容(无论是内联的还是外部

我知道Javascript按顺序执行代码。但是,我总是试图确定是否有任何代码在每个函数编译执行后立即“一行接一行”运行,或者脚本中的所有立即函数调用是否在实际运行之前等待整个脚本完成解析

我想更好地理解javascript解析和执行代码的方式。主要用于外部脚本,这在控制台日志中似乎有点难以观察


一个适用的用途是尝试在外部脚本中尽早截取“interactive”document.readyState,因为“interactive”状态有时会很早触发。根据

否。脚本标记的整个内容(无论是内联的还是外部的)必须先进行解析,然后才能对其进行评估


这是因为javascript将变量和函数声明提升到其作用域顶部的方式:

否。必须先解析脚本标记的整个内容(无论是内联还是外部),然后才能对其进行求值

这是因为javascript将变量和函数声明提升到其作用域的顶部:

javascript是*并且一次执行一个脚本(标记)。因此,在每个脚本标记中,无论是内联的还是源于文件的,都会编译并执行整个代码。但每个单独的脚本标记都是按顺序编译和执行的

您可以通过运行以下两个示例来检查这一点:

例1:

<html>
<script>
    alert(x);
    var x;
</script>
</html>

警报(x);
var x;
上述代码将提示“未定义”。另一方面

例2:

<html>
<script>
    alert(x);
</script>
<script>
    var x;
</script>
</html>

警报(x);
var x;
上面的代码将触发一个错误,因为x不存在


注意:

Javascript是*并且一次执行一个脚本(标记)。因此,在每个脚本标记中,无论是内联的还是源于文件的,都会编译并执行整个代码。但每个单独的脚本标记都是按顺序编译和执行的

您可以通过运行以下两个示例来检查这一点:

例1:

<html>
<script>
    alert(x);
    var x;
</script>
</html>

警报(x);
var x;
上述代码将提示“未定义”。另一方面

例2:

<html>
<script>
    alert(x);
</script>
<script>
    var x;
</script>
</html>

警报(x);
var x;
上面的代码将触发一个错误,因为x不存在



注意:

Javascript是解释的,而不是编译的。这个故事比现代JS运行时上的要复杂得多!整个
块将被解析,然后进行求值。@scrblnrd3虽然我理解这种情绪,但该语句并不完全正确:声明可以出现在任何地方,并且必须在执行任何代码之前进行处理,因此一种简单的方法是在执行开始之前解析整个脚本。但是,很可能在解析完成之前可以执行某些代码,但一旦遇到本地范围中未定义的标识符(或至少是到目前为止已解析的部分),执行必须停止,以防稍后在脚本中定义或实例化该标识符。这些类型的实现细节可能因主机而异。Javascript是解释的,而不是编译的。这个故事比现代JS运行时上的要复杂得多!整个
块将被解析,然后进行求值。@scrblnrd3虽然我理解这种情绪,但该语句并不完全正确:声明可以出现在任何地方,并且必须在执行任何代码之前进行处理,因此一种简单的方法是在执行开始之前解析整个脚本。但是,很可能在解析完成之前可以执行某些代码,但一旦遇到本地范围中未定义的标识符(或至少是到目前为止已解析的部分),执行必须停止,以防稍后在脚本中定义或实例化该标识符。这些类型的实现细节可能会因主机而异。这可能会导致一些非常奇怪的性能问题:Gmail团队在html注释中加载javascript(因为html解析是增量的),然后在需要时对其进行评估。好的,我假设该块与评估过程有关,但只需要确认。我想唯一可靠的不错过“交互”状态的方法是将其全部放在标题中。感谢像
document.readyState这样的书籍,在IE9(和IE10?)中,有时会错误地从“加载”更改为“交互”。jQuery和domReady都调整了测试以解决这个问题。除了上面链接到的jQuery错误之外,请看一看是的,我相信这是IE9和可能是10的问题。尽管我没有使用任何库方法。我更喜欢直接调用document.onreadystatechange。由于这个错误,我不得不回退到“完成”状态,否则我的“交互式”事件。“complete”的问题是,在window.load之前,窗口可能会显示您想要隐藏的内容。我想,不得不到处乱跑的IE臭虫的日子还没有结束(这可能导致一些非常奇怪的性能问题:Gmail团队在html注释中加载javascript(因为html解析是增量的)然后在需要时对其进行评估好的,我假设该块与评估过程有关,但只需要确认。我认为不错过“交互”状态的唯一可靠方法是将其全部放在标题中。感谢像
document.readyState
这样的书籍在IE9中错误地从“加载”更改为“交互”(还有IE10?)有时候。jQuery和domReady都调整了它们的测试来解释这一点。除了上面链接的jQuery错误之外,看看是的,我相信这是IE9和可能是10的问题。虽然我没有使用任何库方法。我更喜欢直接调用document.onreadystatechange。由于这个错误,我不得不退回到“完成”状态为了我的“互动”