Las funciones en JavaScript son las primeras clases de objetos. Esto significa que se
puede pasar como cualquier otro valor. Un uso común de está característica es pasar de
una función anónima a otra, posiblemente una función asíncrona. Esto se conoce como callback.
function foo() {}
La función anterior se carga así mismo antes de iniciar la ejecución del programa; por lo tanto, está disponible en todo el scope (ámbito) de la aplicación donde se ha definido, aunque hubiera sido llamado antes de definirse en el código.
foo(); // Funciona porque foo ha sido creado antes que este código se ejecute
function foo() {}
var foo = function() {};
Este ejemplo asigna una función sin nombre y anónima a la variable foo.
foo; // 'undefined'
foo(); // Lanza TypeError
var foo = function() {};
Debido a la declaración de var, que carga el nombre de la variable foo antes
de la ejecución real del inicio del código, foo ya estará definidido cuando se
ejecute el script.
Pero se asigna sólo si ocurre en tiempo de ejecución, el valor de foo de forma
predetermina es undefined antes de que el código se ejecute.
Otro caso especial de asignación de nombre de funciones.
var foo = function bar() {
bar(); // Funciona
}
bar(); // ReferenceError
Aquí bar no está disponible en el ámbito externo (scope), ya que la función sólo es
asignada a foo; Sin embargo, dentro de bar si está disponible. Esto se debe a la forma
en como trabaja la resolución de nombres en JavaScript, el nombre de
la función esta siempre disponible en el ámbito local de la propia función.