¿Se alzan las funciones internas en JavaScript? ¿Cómo se aplican a ellos las reglas de scope?

Pensé que JavaScript no tiene un scope de bloque, sino un scope de función, y que las declaraciones se elevan de su locking a la parte superior de sus funciones principales.

Sin embargo, el siguiente código no funciona como se esperaba:

function one(a) { console.log("one called for " + a); if (a == 1) { function inner(b) { console.log("inner called for " + b); } inner(123); } inner(456); } one(1); one(2); one(3); 

El primero one(1); la llamada se realiza normalmente, sin errores, sin embargo, la ejecución se detiene cuando el segundo one(2); se llama.

Este comportamiento es intuitivo: la función inner se define solo si a==1 .

Pero, ¿cómo es consistente con las reglas de scope / elevación?

¡Pensé que su definición sería colocada en la parte superior de su scope, fuera del bloque if que se supone que no tiene efecto!

Editar: aquí están los errores que estoy recibiendo:

Captura de pantalla de la consola de Firefox que muestra el error.

El navegador es Firefox. Violín aquí

2 Solutions collect form web for “¿Se alzan las funciones internas en JavaScript? ¿Cómo se aplican a ellos las reglas de scope?”

 if (…) { function …() { … } } 

No es válido ECMAScript. Las declaraciones de funciones deben estar en el nivel superior de los cuerpos de funciones o progtwigs, dentro de los bloques, su comportamiento depende de la implementación . Firefox ejecuta esta statement de función de forma condicional, otros navegadores la alzan como una statement de función normal. Muévalo fuera de la sentencia if, o asigne una expresión de función.

La statement de inner se eleva a la parte superior de la función externa. Sin embargo, su valor solo se establece si a == 1 .

Cuando se llama a outer() con un valor diferente, la llamada a inner(456) falla porque inner aún se establece como undefined .

  • ¿Puede una propiedad de object JavaScript referirse a otra propiedad del mismo object?
  • Desventajas de Javascript "single var pattern"
  • Destructuring con objects nesteds y valores pnetworkingeterminados
  • Declarando múltiples variables en JavaScript
  • Declaración de function ambigua en Javascript
  • Javascript tiene muchos buenos JS marco (como Node.js AngularJS Vue.js React.js) es el mejor lenguaje de script.