Как "область" работает с несколькими тегами script для Javascript в HTML-документе?

Я не совсем уверен, что происходит между тегами <script>. Например, приведенное ниже дает ошибку ссылки и тип ошибки в Chrome:

<html>
    <head>
    <script type="text/javascript">
        T.prototype.test = function() {
            document.write("a");
        }
    </script>
    <script type="text/javascript">
        function T() {}
        var v = new T();
        v.test();
    </script>
    </head>
    <body>
    </body>
</html>

Но это работает:

<html>
    <head>
    <script type="text/javascript">
    </script>
    <script type="text/javascript">
        T.prototype.test = function() {
            document.write("a");
        }
        function T() {}
        var v = new T();
        v.test();
    </script>
    </head>
    <body>
    </body>
</html>

Ответы

Ответ 1

Верхний script выполняется первым в первом примере, поэтому он еще не знает о T, следовательно, ошибка.

Во втором примере T хорошо определен и известен везде, как только выполняется тэг script. Это связано с тем, что объявления функций поднимаются вверх, независимо от того, какой заказ, они всегда доступны. Объявление объявления функции более подробно объяснено здесь

Второй пример после подъема:

var v,
   T = function(){}; /* using comma like this is short-hand for: var v; var T = function(){}; */

T.prototype.test = function() {
        document.write("a");
    };

v = new T();
v.test();

Ответ 2

Каждый из них анализируется в глобальном контексте, но по порядку. Весь первый тег script анализируется и выполняется до того, как будет рассмотрен второй. В рамках анализа a script объявления функций распознаются заранее, поэтому вторая работает, а первая не работает.