Не работает, потому что код в элементах <script>
выполняется последовательно и независимо (по умолчанию предполагается синхронные сценарии). То есть две разные <script>
секции не могут напрямую ссылаться друг на друга. Теперь JavaScript "поднимает" function name () {}
конструкции в том же контексте , так что это сработало бы "не по порядку" в одном <script>
.
Преамбула / предупреждение:
Рассмотрим , а не , используя onload
. Если что-то еще попытается использовать (onload
), то что-то, скорее всего, сломается. (Я рекомендую jQuery, потому что он «понимает это правильно» и «чертовски легко» ... опять же, так делают многие другие фреймворки. Выберите один: -)
Например, это будет работать в jQuery:
jQuery(function () { Main() })
Объяснение того, почему это работает (и как это исправить, не переупорядочивая скрипты или используя jQuery):
Обратите внимание, что в этом случае вызывается внутренний обработчик событий jQuery, который вызывает анонимный обратный вызов, который затем вызывает Main
(который теперь преобразуется в объект-функцию). «Подобный» код здесь будет:
window.onload = function () { Main() }
Они работают, потому что Main
является , не оценивается до тех пор, пока не будет загружено , и в этом случае все элементы [синхронный] <script>
были выполнены. (Пожалуйста, смотрите мой комментарий относительно того, что означает оценка Main
.)
С другой стороны, window.onload = Main
(или jQuery(Main)
) оцените Main
прямо тогда и используйте полученное значение; как уже отмечали другие, Main
не установлено («не определено») на этом этапе из-за упорядочения элементов <script>
(они запускаются последовательно).
Пожалуйста, обратитесь к примечанию вверху о том, почему не , чтобы использовать onload
напрямую; -)
Счастливого кодирования.