JavaScript程序包括报表和功能的声明。当JavaScript执行程序,这两个步骤:

  1. 代码扫描功能的声明和每一个函数。《宣言》是"执行"(通过创建一个函数目)及一名参考这一职能是创建(使这种功能可以从内的一个声明)

  2. 该声明是执行(评估)的顺序(因为他们出现在代码)

因此,这个 工作就好了:

<script>
    foo();
    function foo() {
        return;
    }
</script>

虽然"foo"功能是所谓的之前就宣布,它的工作,因为功能宣言》进行评估之前发言。

然而,这个 不工作:

<script>
    foo();
</script>
<script>
    function foo() {
        return;
    }
</script>

一ReferenceError会被扔("foo没有定义").这导致结论,即每一个脚本元素内HTML码的网页表示一个单独的JavaScript程序和每次HTML分析程序遇到的一个脚本的元素,它的执行程序的内部元件(然后一旦执行程序,分析器移到HTML的代码如下的脚本元素)。

然后,这种 不工作:

<script>
    function foo() {
        return;
    }
</script>
<script>
    foo();
</script>

我的理解是,全球对象(其作为变量对象在全球的执行方面)是否存在(并仍然是)在所有时间,所以第一JavaScript程序,将创建的函数目和作参考之用,然后第二JavaScript程序将使用参考电话的功能。因此,所有JavaScript程序(在一个单一的网-页)"使用"相同的全球目,并且所有变化,做到全球目通过一个JavaScript程序可以观察到所有的JavaScript运行的程序。

现在,请注意这个...

<script>
    // assuming that foo is not defined
    foo();
    alert(1);
</script>

在上述情况下,将报警电话 不执行, ,因为"foo()"的发言引发ReferenceError(打破整个JavaScript程序),因此,随后的所有发言不要执行。

然而,在这种情况下...

<script>
    // assuming that foo is not defined
    foo();
</script>
<script>
    alert(1);
</script>

现在,警报的呼叫 没有得到执行.第一JavaScript程序引发一ReferenceError(并因此符),但第二JavaScript程序运行正常。当然,浏览器将报告错误(尽管它没有执行后续JavaScript程序之后,发生错误).

现在,我的结论是:

  • 每一个脚本元素内HTML码的网页表示一个单独的JavaScript程序。这些程序立即执行作为HTML分析程序遇到他们。
  • 所有JavaScript程序在同一网页的"使用"相同的全球对象。全球对象的存在在所有时间(从目前的网页获取直到该网页被摧毁).JavaScript程序的可操作的全球目,并且所有变化,做到全球目通过一个JavaScript程序中可以观察到随后的所有JavaScript程序。
  • 如果一个JavaScript程序的中断(通过具有一个错误),这并不妨碍随后的JavaScript程序来执行。

请的事实-检查后,并告诉我如果我得到了错误的东西。

此外,我还没有找到资源,解释该行为所提到的在这个岗位,并且我假定的浏览器制造商必须公布这种资源的地方,所以如果你知道关于他们,请提供链接。

有帮助吗?

解决方案

德米特里*梅德Soshnikov已经回答了你的问题。每 <script> 元件的执行作为一个节目,作为定义的写法规范。有一个全球目,每个节目的内的一个单页的使用。这是真的。

其他提示

职能提升的过程中,评估 function 发言的其余部分之前的功能是部分的写请参考标准(我不能找到一个参考的权利,但是我记得看到讨论的EMCAScript提及)。评估 script 标签的一部分HTML标准。它没有指明他们是"独立的程序"在这么多的话,但它确实说,剧本要素进行评估以它们出现在该文件中。这就是为什么功能在以后的剧本标记不悬挂:脚本没有被评估。这也解释了为什么一个脚本停止不切断其后的脚本:当前脚本停评估,在下一个开始。

他们是分开的程序,但他们修改了一个全球共同的对象。

另一种方式来想想这是伪地vs全球范围。每一个脚本《宣言》有一个当地范围到它的前方法/职能,以及访问当前(此前宣布的)全球范围。每当一个方法/多功能的定义是在一个脚本块,然后添加到全球范围和成为可通过脚本块之后。

此外,这里有一个进一步参考,从 W3C 在脚本《宣言》/处理/修改:

动态修改的文件 可以仿照如下:

  1. 所有的剧本要素进行评估,以便作为该文件加载。
  2. 所有的剧本结构内指定文本元素的生成 SGML CDATA进行评估。他们 合并产生的案文被插在 该文件的脚本 元素。
  3. 所产生的CDATA是重新评估。

是另一个很好的资源在脚本/功能评估/宣言》。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top