Me pregunto por qué la salida de la tercera consola.log es 2. Sé que las declaraciones var se elevan (sin su inicialización de valor) a la parte superior del alcance global o de función al que pertenece, incluso cuando está dentro de un bloque with o catch. Todavía estoy estudiando javascript en este momento y nadie puede explicarme correctamente, ya que esperaba que el valor de los últimos 2 console.log no esté definido. ¿Por qué el segundo archivo console.log no está definido y la última salida de console.log es 2? ¿Por qué el último puede acceder al valor de y dentro del bloque catch?
(function () { try { throw new Error(); } catch (x) { var x = 1, y = 2; console.log(x); } console.log(x); console.log(y); })();Ambos x,y son izados. var tiene un alcance de función, por lo que se izarán sin inicialización en la parte superior del bloque.
(function () { var x,y; try { throw new Error(); } catch (x) { x = 1; y = 2; console.log(x); } console.log(x); console.log(y); })(); Tiene una variable local en el bloque catch debido a catch(x). Cuando haces x=1 dentro del bloque catch , solo estás cambiando el valor de tu x local (el que es el parámetro del bloque catch). La x interior sombrea la x exterior. La x exterior aún no está undefined . Actualizar y actualizará el exterior, por lo tanto, su salida.
La explicación tiene todo que ver con la elevación y la asignación variables.
En el bloque catch, la variable y se eleva al nivel de función de la función anónima
Dado que su bloque catch está escrito como " catch (x) ", la instrucción var está asignando su valor local de x dentro del bloque catch a 1 . Es por eso que el primer console.log(x) devuelve 1 .
La forma en que está escrito su código, la variable x no está definida en el nivel de función, lo que da como resultado que el segundo console.log(x) devuelva undefined .
la variable y se eleva al nivel de función (a pesar de que la asignación aparece en la línea var dentro del bloque catch). Por lo tanto, la asignación var en el bloque catch almacena el valor de y como 2 en el nivel de función.
Es por eso que aparece como 2 en su tercera declaración de console.log .
Consulte los siguientes ejemplos de código con la introducción de una variable z dentro de los bloques try/catch
Ejemplo 1:
(function () { try { var z='before'; throw new Error(); var z='after'; } catch (x) { var x = 1, y = 2 console.log(x); } console.log(x); console.log(y); console.log(z); })();donde console.log(z) responderá con ' before '
Ejemplo #2:
(function () { try { var z='before'; throw new Error(); z='after'; } catch (x) { var x = 1, y = 2, z='catch' console.log(x); } console.log(x); console.log(y); console.log(z); })();donde console.log(z) responderá con ' catch '
En JS, var tiene un alcance de función para que pueda acceder a y en cualquier lugar de la función. Para x , tiene dos variables separadas, una en catch(x) y la segunda se inicializa en el interior catch.