traduccion español equipment closure javascript hoisting

español - this javascript



Elevación variable (5)

alert(myVar1); return false; var myVar1;

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

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

¿Cualquier razón?


A veces, el izaje se explica de una manera que puede dar una impresión equivocada, es decir, las variables y funciones son elevadas por JavaScript como si se movieran físicamente hacia arriba, lo cual no es correcto, como lo demuestra el siguiente código:

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

Lo que vemos en la consola undefined está undefined , no es ''Hello World'' , así 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);

que puede obtener la impresión de la declaración de variables y funciones que se mueve a la declaración superior.

Pero JavaScript no está moviendo tu código a ninguna parte. Necesita comprender el contexto de ejecución en JavaScript. Tiene dos fases de fase de creación y ejecución. En la fase de creación, el espacio de memoria se crea para estas variables y funciones, y las personas parecen confundir este paso con el izado. JavaScript 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, las funciones pueden colocarse completamente en la memoria pero en el caso de variables las asignaciones se procesan en la fase de ejecución del contexto de ejecución. Entonces cuando lo haces var a = ''Hello World!'' El motor de 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 como indefinidas en JavaScript. Por lo tanto, no es bueno confiar en izar y ver indefinido. Por lo tanto, siempre es bueno declarar variables y funciones sobre tu código.


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

var myVar1; alert(myVar1); return false;

Esto se debe a que javascript no tiene realmente un verdadero sentido del alcance léxico. Esta es la razón por la cual se considera que es la mejor práctica que todas las variables declaradas en la parte superior del área se usen para evitar que el izado provoque un problema. JSLint se queja acerca 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 quiere hacer un verdadero ejemplo de elevación (tomado del enlace de arriba)

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

Esto alertará a 10

EDITAR DESPUÉS DEL COMENTARIO

Debajo está mi entendimiento y lo he leído en alguna parte pero no puedo encontrar todas las fuentes que leí, así que estoy abierto a la corrección.

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


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, he referido el enlace javascript hoisting: http://www.ufthelp.com/2014/11/JavaScript-Hoisting.html


Este código tiene poco sentido:

  • El var myVar1 nunca se ejecutará.
  • El resultado es return false; no devolverá nada ya que no está en una función

Opera, IE y FF tienen razón al lanzar un error porque este código no es realmente 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 de JavaScript que usan está listo para manejar el código erróneo. Mi suposición sería que ven el " return " y lo sueltan o lo reemplazan con algún tipo de break .

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


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

Un programa ECMAScript se considera sintácticamente incorrecto si contiene una declaración de 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 hubieses escrito:

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

Además, la sección 16 (página 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:

  • Los usos inadecuados de retorno, corte y continuar.

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

Una implementación debe informar todos los errores como se especifica, a excepción de lo siguiente:

  • Una implementación puede proporcionar tipos, valores, objetos, propiedades y funciones adicionales además de los descritos en esta especificación. Esto puede hacer que los constructos (como buscar una variable en el ámbito global) tengan un comportamiento definido por la implementación en lugar de arrojar un error (como por ejemplo el error de referencia ).