no estoy seguro de haber entendido el análisis de tu primer punto. en este caso, al invocar
escribe, la función
registrarHandler utiliza como handler cualquier cosa que haya sido devuelta por la función
escribe — aparentemente
undefined. pudistes haber pasado el identificador de la función —
escribe— pero los argumentos recibidos probablemente no sean los que necesitas en la función.
sobre el segundo punto; cierto que las funciones son objetos tipo Function. sin embargo, no es necesariamente cierto que la definición de la función esté antes que su invocación. todo dependerá de como declares la función: function expression o function declaration.
Código:
// function expresssion ;
console.log(typeof fn); // undefined;
// console.log(typeof fn()); // genera error de TypeError: undefined is not a funcion ;
var fn = function(){ return 0; };
console.log(typeof fn); // function;
en este ejemplo, nótese que la primera instrucción devuelve
undefined pese a que antes de dicha línea no existe declaración alguna del identificador
fn. esto es porque javascript, cuando entra en el contexto de un scope reserva todos los identificadores de variables explícitas (iniciados con
var) y de funciones declarada con la instrucción
function (ver próximo ejemplo). en este caso, javascript automáticamente asigna como valor
undefined a los identificadores. si
descomenta la tercera línea (la que invoca la función
fn) en la consola debes ver que se genera un error.
Código:
// function declaration ;
console.log(typeof fn); // function ;
console.log(typeof fn()); // number ;
function fn(){ return 0; } // nótese la diferencia con el ejemplo anterior ;
console.log(typeof fn); // function ;
en este caso particular, cuando javascript entra en el contexto del scope, las funciones declaradas se crean primero. es por ello que la primera línea muestra
function en la consola.