¿Es mejor poner JavaScript en el encabezado o al final de la página?

De MDN :

aplazar : -Este atributo booleano se establece para indicar a un navegador que el script debe ejecutarse después de que el documento se haya analizado. Dado que esta característica aún no ha sido implementada por todos los demás navegadores principales, los autores no deben suponer que la ejecución del script se aplazará . Nunca llame a document.write () desde un deferscript (desde Gecko 1.9.2, esto eliminará el documento). El atributo de aplazamiento no debe usarse en scripts que no tengan el atributo src. Desde Gecko 1.9.2, el atributo diferido se ignora en los scripts que no tienen el atributo src. Sin embargo, en Gecko 1.9.1, incluso los scripts en línea se difieren si se establece el atributo de aplazamiento.

asíncrono [HTML5]: establezca este atributo booleano para indicar que el navegador debe, si es posible, ejecutar el script de forma asincrónica. No tiene ningún efecto en los scripts en línea (es decir, los scripts que no tienen el atributo src ). En los navegadores más antiguos que no admiten el atributo asíncrono , las secuencias de comandos insertadas en el analizador bloquean el analizador; los scripts insertados con script se ejecutan de forma asincrónica en IE y WebKit, pero sincrónicamente en Opera y Firefox anterior a 4.0. En Firefox 4.0, la propiedad DOM asíncrona se establece de manera predeterminada en verdadero para las secuencias de comandos creadas por script, por lo que el comportamiento predeterminado coincide con el comportamiento de IE y WebKit. Para solicitar que los scripts externos insertados por script se ejecuten en el orden de inserción en los navegadores donde el document.createElement (“script”). Async se evalúa como verdadero (como Firefox 4.0), establezca .async = false en los scripts que desea mantener el orden . Nunca llame a document.write () desde un script asíncrono. En Gecko 1.9.2, llamar a document.write () tiene un efecto impredecible. En Gecko 2.0, llamar a document.write () desde un script anasync no tiene ningún efecto (aparte de imprimir una advertencia en la consola de error).

Los navegadores más antiguos / Opera pueden dar un grito.

Aquí está de Opera: –
http://dev.opera.com/articles/vi…
En donde dice:-
Opera ignora por completo el atributo de aplazamiento. y tiene una buena explicación de por qué lo hace.

Y aquí está el gran Yahoo, donde sugiere que es preferible colocar los scripts en la parte inferior de la página en comparación con el uso de aplazar:

http://developer.yahoo.com/blogs…
En donde dice:
Si se puede diferir un script, también se puede mover al final de la página.

Y aquí hay una buena publicación del desbordamiento de la pila que proporciona una mejor explicación de cuándo es conveniente colocar scripts en la parte inferior de la página:

http://stackoverflow.com/a/143527

También puede encontrar buenas prácticas cuando ejecuta el complemento YSlow en su página web.

Por lo tanto, diría que vaya a la colocación de etiquetas de script en la parte inferior de la página y organice los scripts en la parte superior o inferior según sus requisitos.

Depende completamente de la aplicación web que escriba.

Si escribe una aplicación web que funciona principalmente con el código JavaScript, coloque la parte central de su código JavaScript en la sección de cabecera; los módulos y otras cosas al final del cuerpo. p.ej. Gmail, Google Maps. – aplicaciones que requieren JavaScript como columna vertebral.

Si su aplicación es un sitio web o una página web, entonces se usa principalmente JavaScript como clave para proporcionar una buena experiencia de usuario, proporcionando extras a los elementos DOM. En este caso, la representación de la página puede ser lenta si coloca todo su código JavaScript en la sección de cabecera, porque los navegadores primero descargan el archivo de secuencia de comandos y luego la parte del cuerpo. Esto hace que el usuario vea una página en blanco durante más tiempo. Por lo tanto, se recomienda colocarlo al final del cuerpo. En este caso, el usuario ve la página web rápidamente y no necesita esperar hasta que se cargue todo el script.

Editar:
Además de eso, si está cargando scripts externos, la representación de la página puede ser lenta. Google sigue un truco bastante bueno para evitar esto para cargar ga.js de forma asincrónica. El soporte asíncrono se logra mediante dos partes:

  1. usando el script en su página para escribir una etiqueta de script en el DOM.
  2. ese script tiene async = true para indicar a los navegadores compatibles que puede continuar renderizando la página.

La primera parte funciona en navegadores que no admiten el atributo asíncrono, y la segunda parte en navegadores que sí lo hacen. Además, lea sobre esta publicación: http://googlecode.blogspot.in/20

Cabeza , con carga asincrónica.

De forma predeterminada, cuando el navegador encuentra un elemento de script , detiene el análisis del marcado hasta que se carga y ejecuta el archivo JavaScript.

Para evitar que se bloquee el analizador, marque el script como async o defer :

   

defer scripts siempre ejecutados en el orden en que están, con el segundo script ejecutado solo después de que finalice el primero. No se garantiza que las secuencias de comandos async se ejecuten en orden.

defer cuota de mercado admite el aplazamiento en el 85% de los navegadores, se degrada con gracia y puede reducir los tiempos de carga a la mitad: webkit.org/blog/1395/running-scripts-in-webkit.

http://www.w3.org/TR/2011/WD-html5-20110525/scripting-1.html#attr-script-async