2010-09-16 23 views
24
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 (muestra undefined) en Safari y Chrome.Elevación variable

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

¿Alguna razón?

+10

Tengo miedo, estoy confundido y algo intrigado ... ¿Qué intentas hacer? –

+2

@Hahsen, intento entender varios errores de navegador y de JavaScript disponibles. Este es el izado variable y estoy tratando de entender su comportamiento en el alcance global junto con una declaración de devolución. Aunque no se permite el retorno cuando no está en la definición de la función, pero el código sigue funcionando en cromo y safari. Estoy tratando de averiguar el motivo – alter

+0

Puede ser más fácil de entender como variable y declaración * preprocesamiento *. Las declaraciones no se mueven (ni se "levantan hacia arriba"), sino que se procesan antes de que se ejecute cualquier código. Lea ECMA-262 §10.3 sobre lo que sucede al ingresar a un contexto de ejecución, es razonablemente fácil de entender. – RobG

Respuesta

23

En las variables JavaScript se mueven a la parte superior del guión y luego en Ejecutar. Así que cuando se ejecuta hará

var myVar1; 
alert(myVar1); 
return false; 

Esto se debe a javascript doesnt realmente tienen un verdadero sentido de ámbito 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 explica que http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting

El retorno no es válido. Si usted quiere hacer un verdadero ejemplo de elevación (tomada desde el enlace anterior) hacer

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

Esto alertará a 10

Edición después COMENTARIO

A continuación es mi entendimiento y me lo han leído en algún lugar, pero no puedo encontrar todas las fuentes que leí, entonces estoy abierto a la corrección.

Esto alerta gracias a las diferencias en el 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 ejecuta 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.

+1

@Automater Tester, su código es perfecto y es un buen ejemplo de elevación en JavaScript. Pero lo que quiero saber es por qué el retorno no arrojó errores en Chrome y safari. – alter

+0

@alter He agregado más información para ti. – AutomatedTester

+3

"En las variables javaScript se mueven a la parte superior del script y luego se ejecutan". En realidad, los nombres variables * (y no las asignaciones/definiciones) se "elevan" al principio del ámbito que los contiene (el que esté más cercano; 'si' et. Al. Do * no * crea un" alcance "en este sentido). – strager

3

Este código tiene poco sentido:

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

Opera, IE y FF tienen razón para lanzar un error porque el código no es realmente válida, ya que no es capaz de volver a menos que estés en una función.

Si funciona en Safari y Chrome, debe ser porque el motor de JavaScript que utilizan está listo para manejar código defectuoso. 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 las funciones: http://www.w3schools.com/js/js_functions.asp

+0

Errores de Chrome para mí cuando uso una declaración * return * fuera de una función. –

+3

var myVar1 se ejecutará siempre gracias al izado – AutomatedTester

+0

independientemente del hecho de que la declaración de devolución no está permitida sin una función, debería haber sucedido aquí y debería haber recibido una alerta diciendo indefinido. No veo que eso ocurra cuando recibo una declaración de devolución. – alter

10

Sección 12.9 (página 75) de ECMA-262 Edición 3 estados:

An ECMAScript program is considered syntactically incorrect if it contains a return statement that is not within a FunctionBody.

es decir, una fuera return de una función es un error de sintaxis . Si se produce un error de sintaxis , no se ejecuta ningún código. Piense en su ejemplo, como si hubiera escrito:

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

Además, la sección 16 (página 157) afirma:

An implementation may treat any instance of the following kinds of runtime errors as a syntax error and therefore report it early:

  • Improper uses of return, break, and continue.

del motor y de Firefox. Alabama. (Es decir, aquellos JavaScript implementaciones que permiten return en el ámbito global) puede ser conformes, asumiendo la cláusula siguiente (en la misma sección) permite la definición aplicación de return en el ámbito global:

An implementation shall report all errors as specified, except for the following:

  • An implementation may provide additional types, values, objects, properties, and functions beyond those described in this specification. This may cause constructs (such as looking up a variable in the global scope) to have implementation-defined behaviour instead of throwing an error (such as ReferenceError).
0

Es JavaScript izado cosa, simplemente, en otras palabras, estamos tratando de imprimir el valor de la variable, que no está llevando a cabo ningún valor

Javascript hará que el código anterior como: -

var myVar1 
 
alert (myVar1) 
 
return false

Para aclarar más i refered el enlace javascript de elevación: http://www.ufthelp.com/2014/11/JavaScript-Hoisting.html

11

veces izado se explica de una manera que puede dar una impresión equivocada, es decir, las variables y funciones se izan por el motor de JavaScript, como si fueran físicamente movido en la parte superior, lo que no es en realidad la derecha, como lo demuestra el código de abajo:

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

lo que vemos en la consola es undefined, no 'Hello World', así que nos dieron la beha Vior 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 tener la impresión de la declaración de variables y funciones que se trasladó a la parte superior comunicado.

Pero JavaScript no está moviendo su 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 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.

Cuestiones relacionadas