Elevación variable


alert(myVar1);
return false;
var myVar1;

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

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

¿Alguna razón?

Author: Michał Perłakowski, 2010-09-16

5 answers

En JavaScript las variables se mueven a la parte superior del script y luego se ejecutan. Así que cuando se ejecuta lo hará

var myVar1;
alert(myVar1);
return false;

Esto se debe a que javascript no tiene realmente un verdadero sentido del ámbito léxico. Esta es la razón por la que se considera una buena práctica tener todas sus variables declaradas en la parte superior del área que se utilizarán para evitar que el ho 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 verdadero ejemplo de elevación (tomado del enlace anterior) haga

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

Esto alertará a 10

EDITAR DESPUÉS DEL COMENTARIO

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

Esto alerta gracias a las diferencias en el JIT de JavaScript. TraceMonkey ( http://ejohn.org/blog/tracemonkey / ) Creo que tomará el 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 se mueve al JIT y luego ejecuta algo. Es más parecido a Python. Si ejecuta el script en la consola del desarrollador (ctrl + shift + j en Windows) en Chrome lanzará un error, pero también se ejecutará para darle la alerta.

 26
Author: AutomatedTester,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-16 16:47:47

A veces el levantamiento se explica de una manera que puede dar una impresión incorrecta, es decir, las variables y funciones son izadas por el motor JavaScript como si estuvieran movidas 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 es undefined, no 'Hello World', así que tenemos el comportamiento del siguiente código

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

No es el comportamiento de

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

Que puede obtener la impresión de que la declaración de variables y funciones es moved to top statement (en inglés).

Pero JavaScript no está moviendo su código a ninguna parte. Necesita entender 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 la elevación. JavaScript en realidad no está moviendo 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, funciones se puede 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. Así que cuando haces var a = 'Hello World!', el motor JavaScript conoce el valor de a cuando comienza a ejecutarlo en la fase de ejecución del contexto de ejecución, por lo que pone un marcador de posición indefinido, y todas las variables se establecen inicialmente en indefinido en JavaScript. Por lo tanto, no es bueno confiar en el levantamiento y ver indefinido. Por lo tanto, siempre es bueno declarar variables y funciones en la parte superior de su codificar.

 16
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-15 12:33:54

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 instrucción return que no está dentro de un FunctionBody.

Es decir, un return fuera 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, la sección 16 (página 157) dice:

An la 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, reportarlo temprano:

  • Usos indebidos de return, break y continue.

Motor de Firefox et. al. (es decir, aquellas implementaciones de JavaScript que permiten return en el ámbito global) puede ser conforme, suponiendo que la siguiente cláusula (en la misma sección) permite la definición de implementación de return en el ámbito global:

Una implementación notificará todos los errores especificados, excepto los siguientes:

  • Una implementación puede proporcionar tipos, valores, objetos, propiedades y funciones adicionales a 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).
 11
Author: strager,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-16 17:03:23

Este código tiene poco sentido:

  • El var myVar1 nunca se ejecutó.
  • El return false; no devolverá una cosa ya que no estás en una función

Opera, IE y FF tienen razón al lanzar un error porque este código realmente no es válido ya que no puede regresar a menos que esté 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. Mi conjetura sería que ven el "return " y caen o reemplazarlo con algún tipo de break.

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

 3
Author: marcgg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-16 10:06:30

Es cosa de elevación de JavaScript, Simplemente en otras palabras, estamos tratando de imprimir el valor de la variable , que no tiene ningún valor

Javascript renderizará el código anterior como: -

var myVar1
alert (myVar1)
return false

Para aclarar más me referí al enlace javascript hoisting: http://www.ufthelp.com/2014/11/JavaScript-Hoisting.html

 0
Author: AugustRush,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-16 13:03:12