En JavaScript, las declaraciones de funciones tienen un comportamiento diferente según el estándar de lenguaje predominante y el entorno en el que se ejecutan.
En modo estricto (ES5)
En modo estricto, introducido en ECMAScript 5 (ES5), las declaraciones de funciones no están permitidas dentro declaraciones condicionales. Esto se debe a que las declaraciones de funciones crean variables elevadas, cuyo alcance abarca toda la función o el alcance global. Colocarlos dentro de una declaración condicional rompería este mecanismo de elevación.
Modo no estricto (ES5)
Sin embargo, en el modo no estricto, el comportamiento de las declaraciones de funciones dentro de las declaraciones condicionales era impredecible. Diferentes navegadores y motores de JavaScript implementaron sus propias reglas para manejar esta situación, lo que generó resultados inconsistentes.
En JavaScript moderno (ES2015)
A partir de 2018, la mayoría de los navegadores modernos admite ECMAScript 2015 (ES2015), que introdujo una interpretación más estricta de las declaraciones de funciones dentro de los bloques. En ES2015, las declaraciones de funciones tienen como alcance el bloque en el que se declaran.
Ejemplo:
Considere el siguiente código:
var abc = '';
if (1 === 0) {
function a() {
abc = 7;
}
} else if ('a' === 'a') {
function a() {
abc = 19;
}
} else if ('foo' === 'bar') {
function a() {
abc = 'foo';
}
}
a();
document.write(abc); //writes "foo" even though 'foo' !== 'bar'
En modo estricto o en ES2015, este código daría como resultado un error porque la función a no está definida en el ámbito global. Sin embargo, en modo no estricto, puede producir resultados diferentes según la implementación. En el ejemplo proporcionado, Chrome genera "foo" mientras que Firefox genera "19".
Recomendación:
Para evitar comportamientos inesperados, se recomienda utilizar expresiones de función en su lugar de declaraciones de funciones al definir funciones condicionalmente. Las expresiones de función crean funciones con alcance a las que solo se puede acceder dentro de su alcance inmediato.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3