Внешние скрипты имеют кучу преимуществ перед внутренними - они кэшируются в бродилке, позволяют писать библиотеки стандартных функций для использования на нескольких страничках, не загромождают код HTML.
Но есть у них и недостатки - они плохо поддерживаются старыми бродилками, кроме того, при вызове функции из внешнего скрипта мы не можем быть уверены в том, что этот скрипт загрузился - в противном случае будет выдано сообщение об ошибке. Особенно плачевно заканчивается использование лентяями внешних скриптов вместо SSI для вывода информации в документ (document.write).
Поэтому грамотный метод использования внешних скриптов такой. В <head> документа, выше всех остальных внешних и внутренних скриптов пишется:
<script language="JavaScript" type="text/javascript"><!-- var jsLoaded=false; //--></script>
Внешний скрипт вставляется так:
<script language="JavaScript1.2" src="myscript.js" type="text/javascript"></script>
Обратите внимание на параметр language - там стоит JavaScript1.2 вместо простого JavaScript для того, чтобы старые бродилки не пытались загрузить то, что они все равно не поймут.
В файле myscript.js последней строчкой должно стоять:
jsLoaded=true;
Затем при необходимости использования функций из внешнего скрипта мы поступаем так:
а) В блоке JavaScript:
<script language="JavaScript" type="text/javascript"><!-- ... // тили-тили // трали-вали if (jsLoaded) { // это дело мне по силе // откажусь теперь едва ли } else { // это мы не проходили // это нам не задавали } ... //--></script>
б) При вызове функции по событию в теге HTML:
<a href="page.html" onClick="return (jsLoaded)?externalFunction(...):true;">