¿Cómo es posible declarar una función dentro de un IfStatement ? porque de acuerdo con la especificación de ecmascript, solo puede haber una declaración allí.
if (Expresión) Sentencia
if ( Expresión ) Sentencia else Sentencia
y FunctionDeclaration no es una Declaración pero es una Declaración
así que tal vez me he perdido algo o tal vez los navegadores no pueden implementar tal cosa hoy en día porque puede arruinar los sitios web que usan declaraciones de función dentro de una declaración if.
No es posible poner una declaración de función en una declaración if . Probar
if (true) function example() {} en modo estricto, obtendrá un SyntaxError . Para declarar una función dentro de una rama condicional, debe colocarla dentro de un bloque , que es una declaración (a través de BlockStatement ) y puede contener declaraciones (en una lista de declaraciones ).
Tal vez los navegadores no puedan implementar tal cosa hoy en día porque pueden arruinar los sitios web que usan declaraciones de función dentro de una declaración if.
Sí, de hecho. Para la compatibilidad web heredada, las declaraciones de función en declaraciones if están permitidas en modo descuidado . No escriba código como ese, pero el navegador puede tratarlo como válido.
De la especificación:
En el nivel superior de una función o secuencia de comandos, las declaraciones de funciones internas se tratan como declaraciones de var.
La cadena va así.
Declaración => Declaración de bloque => Lista de declaraciones => Elemento de lista de declaraciones => Declaración => Declaración Var
Todo está bien aquí, elemento de la lista de declaraciones
https://tc39.es/ecma262/#prod-StatementListItem
Antes de ECMAScript 2015, la especificación de ECMAScript no definía la ocurrencia de una declaración de función como un elemento de la lista de declaraciones de una declaración de bloque. Sin embargo, el soporte para esa forma de FunctionDeclaration era una extensión permitida y la mayoría de las implementaciones de ECMAScript alojadas en el navegador lo permitían.