Alcance de Variables – Parte 2: funciones
Como segunda parte de Alcance de Variables vamos a ver como se comportan las funciones.
En la parte 1 vimos que las declaraciones de variables son alzadas al principio de la función por el interpretador. Bueno, las declaraciones de funciones también lo son.
De la misma manera que en la declaracion de variables, el interpretador alzó la declaracion de la función foo al principio:
En javascript podemos asignar funciones a variables, ya sean anónimas o nombradas, donde el alzado del interpretador puede ser un poco confuso.
Función Anónima
Lo que pasó en ese caso es que el interpretador alzó la declaracion de la variable foo, pero no así su asignación:
Función Nombrada
Sucede lo mismo, con la diferencia que no podemos llamar a la función nombrada desde afuera ya que su alcance no se encuentra en nuestra función, es decir, baz directamente no fue alzada porque ni siquiera se encuentra al alcance de miFuncion, no sabe que existe.
Veamos como fue interpretado:
Como escribir código conociendo todo esto?
Entender como es interpretado nuestro código nos ayuda a ser mas cautelosos al desarrollar evitando problemas futuros. Mi recomendación es que intenten tener un solo var al principio de cada función con todas las declaraciones, ya que al fin y al cabo, va a ser interpretado de la misma manera.
Por último les dejo traducido lo que dice el standard ECMAScript Standard (pdf):
Si la declaración de la variable se produce dentro de una función, las variables se definen con alcance local en esa función. De lo contrario, se definen con un alcance global (es decir, se crean como los miembros del objeto global). Las variables se crean cuando el ámbito de ejecución está introducido. Un bloque no define un nuevo alcance de ejecución. Sólo program y function producen un nuevo alcance. Las variables se inicializan en undefined cuando se crean. Una variable con un inicializador se le asigna el valor cuando la instrucción se ejecuta, no cuando la variable se crea.