Estoy leyendo YDNJS: alcance y cierres, y en el capítulo 4 que habla de izar dice que
Las declaraciones de funciones que aparecen dentro de los bloques normales generalmente se elevan al alcance adjunto, en lugar de ser condicionales como implica este código.
foo(); // "b" var a = true; if (a) { function foo() { console.log("a"); } } else { function foo() { console.log("b"); } }el autor asume que foo() imprimirá 3 en la consola como la última declaración de función anula la anterior en el bloque if antes de que el motor evalúe la condición.
El problema es que cuando ejecuto este código por mi cuenta arroja un TypeError: foo no es una función en lugar de 3.
Funciones creadas condicionalmente Las funciones se pueden declarar condicionalmente, es decir, una declaración de función se puede anidar dentro de una declaración if, sin embargo, los resultados son inconsistentes entre las implementaciones y, por lo tanto, este patrón no debe usarse en el código de producción. Para la creación de funciones condicionales, utilice expresiones de función en su lugar.
var hoisted = "foo" in this; console.log(`'foo' name ${hoisted ? "is" : "is not"} hoisted. typeof foo is ${typeof foo}`); if (false) { function foo(){ return 1; } }En Chrome: se iza el nombre 'foo'. typeof foo no está definido
En Firefox: se iza el nombre 'foo'. typeof foo no está definido
En Edge: el nombre 'foo' no se iza. typeof foo no está definido
En Safari: se iza el nombre 'foo'. typeof foo es función
Lea más sobre esto aquí enlace