¿Por qué el levantamiento de variables después del retorno funciona en algunos navegadores y en otros no?

Resuelto alter asked hace 14 años • 5 respuestas
alert(myVar1);
return false;
var myVar1;

El código anterior arroja un error en IE, FF y Opera indicando que la declaración de devolución debe venir en la función. Pero funciona (muestra undefined) en Safari y Chrome.

El código anterior ha sido escrito en alcance global. Fuera de todas las funciones.

¿Cualquier razón?

alter avatar Sep 16 '10 17:09 alter
Aceptado

En JavaScript, las variables se mueven a la parte superior del script y luego se ejecutan. Entonces, cuando lo ejecutes, funcionará.

var myVar1;
alert(myVar1);
return false;

Esto se debe a que JavaScript realmente no tiene un verdadero sentido de alcance léxico. Es por eso que se considera una buena práctica declarar todas las variables en la parte superior del área que se utilizarán para evitar que la elevación cause un problema. JSLint se quejará de esto.

Este es un buen artículo que lo explica: http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting

La devolución no es válida. Si desea hacer un ejemplo de elevación real (tomado del enlace de arriba), hágalo

var foo = 1; 
function bar() { 
    if (!foo) { 
        var foo = 10; 
    } 
    alert(foo); 
} 
bar();

Esto alertará a 10

A continuación se muestra mi comprensión y lo he leído en alguna parte, pero no puedo encontrar todas las fuentes que leí, por lo que estoy abierto a corrección.

Estas Alertas gracias a las diferencias en el JIT de JavaScript. TraceMonkey ( http://ejohn.org/blog/tracemonkey/ ) Creo que tomará JavaScript y hará un análisis estático rápido y luego hará JIT y luego intentará ejecutarlo. Si eso falla, obviamente nada funciona.

V8 no hace el análisis estático y pasa al JIT y luego ejecuta algo así. Es más parecido a Python. Si ejecuta el script en la consola del desarrollador (ctrl+shift+j en Windows) en Chrome, generará un error pero también se ejecutará para brindarle la alerta.

AutomatedTester avatar Sep 16 '2010 10:09 AutomatedTester

A veces, el izado se explica de una manera que puede dar una impresión errónea, es decir, las variables y funciones se izan mediante el motor JavaScript como si se movieran físicamente en la parte superior, lo que en realidad no es correcto, como lo demuestra el siguiente código:

console.log(a);
var a = 'Hello World!';

Lo que vemos en la consola undefinedno es así 'Hello World', por lo que obtuvimos el comportamiento del siguiente código

var a;
console.log(a);
a = 'Hello World!';

no el comportamiento de

var a = 'Hello World!';
console.log(a);

lo cual puede tener la impresión de que la declaración de variables y funciones se movió a la declaración superior.

Pero JavaScript en realidad no mueve su código a ninguna parte. Debe comprender el contexto de ejecución en JavaScript. Tiene dos fases: fase de creación y fase de ejecución. En la fase de creación se crea espacio de memoria para estas variables y funciones, y la gente parece confundir este paso con izar. En realidad, JavaScript no mueve su código a ninguna parte, lo que sucede es que JavaScript ha creado espacio de memoria para todo su código, es decir, variables y funciones, las funciones se pueden colocar completamente en la memoria, pero en el caso de las variables, las asignaciones se procesan en la fase de ejecución del contexto de ejecución. Entonces, cuando haces var a = 'Hello World!', el motor JavaScript sabe el valor de acuando comienza a ejecutarlo en la fase de ejecución del contexto de ejecución, por lo que coloca un marcador de posición indefinido y todas las variables se configuran inicialmente como indefinidas en JavaScript. Por lo tanto, no es bueno confiar en izar y ver lo indefinido. Por eso siempre es bueno declarar variables y funciones encima de su código.

 avatar Sep 09 '2015 09:09

La sección 12.9 (página 75) de ECMA-262 edición 3 establece:

Un programa ECMAScript se considera sintácticamente incorrecto si contiene una returndeclaración que no está dentro de FunctionBody .

Es decir, un returnfuera de una función es un error de sintaxis . Si se produce un error de sintaxis , no se ejecuta ningún código. Piensa en tu ejemplo como si hubieras escrito:

alert(myVar1);
return false;
syntax error))))))))))))))))));

Además, el artículo 16 (foja 157) establece:

Una implementación puede tratar cualquier instancia de los siguientes tipos de errores de tiempo de ejecución como un error de sintaxis y, por lo tanto, informarlo con anticipación:

  • Usos inadecuados de regresar, romper y continuar.

El motor de Firefox et. Alabama. (es decir, aquellas implementaciones de JavaScript que lo permiten returnen el ámbito global) pueden ser conformes, asumiendo que la siguiente cláusula (en la misma sección) permite la definición de implementación returnen el ámbito global:

Una implementación deberá informar todos los errores según lo especificado, excepto los siguientes:

  • Una implementación puede proporcionar tipos, valores, objetos, propiedades y funciones adicionales más allá de los descritos en esta especificación. Esto puede hacer que las construcciones (como buscar una variable en el ámbito global) tengan un comportamiento definido por la implementación en lugar de generar un error (como ReferenceError ).
strager avatar Sep 16 '2010 16:09 strager

Este código tiene poco sentido:

  • Nunca se var myVar1ejecutará.
  • No return false;devolverá nada ya que no estás en una función.

Opera, IE y FF tienen razón al arrojar un error porque este código realmente no es válido ya que no puedes regresar a menos que estés en una función.

Si funciona en Safari y Chrome debe ser porque el motor javascript que utilizan está listo para manejar código con errores. Supongo que ven el " return" y lo eliminan o lo reemplazan con algún tipo de break.

Más información sobre funciones: http://www.w3schools.com/js/js_functions.asp

marcgg avatar Sep 16 '2010 10:09 marcgg