No puedo entender por qué las variables actúan tan extrañas cuando se declaran dentro de una función.
En la
first
función declaro conlet
las variablesb
yc
con el valor 10 :b = c = 10;
En la
second
función que muestro:b + ", " + c
Y esto muestra:
10, 10
También en
first
función declaroa
con valor 10 :let a = b = c = 10;
Pero en la
second
función muestra un error:No se puede encontrar la variable:
a
Ahora en la
first
función declarod
con valor 20 :var d = 20;
Pero en la
second
función muestra el mismo error que antes, pero con la variabled
:No se puede encontrar la variable:
d
Ejemplo:
function first() {
let a = b = c = 10;
var d = 20;
second();
}
function second() {
console.log(b + ", " + c); //shows "10, 10"
try{ console.log(a); } // Rreference error
catch(e){ console.error(e.message) }
try{ console.log(d); } // Reference error
catch(e){ console.error(e.message) }
}
first()
javascript
variable-declaration
balido intertemento
fuente
fuente
b
yc
no se puede anteponer lavar
palabra clave.a
yd
son locales parafirst
.Dim Apple, Banana, Pear As Fruit
significaDim Apple / Dim Banana / Dim Pear As Fruit
, y noDim Apple As Fruit / ...
.Respuestas:
Es porque en realidad estás diciendo:
Y no lo que crees que estás diciendo, que es:
Notarás que no importa cuántas variables agregues a tu cadena, solo será la primera (a) que causa el error.
Esto se debe a que "let" define su variable en el bloque (o "localmente", más o menos significa "entre paréntesis") en el que lo declara.
Si declara una variable sin "let", abarca la variable globalmente.
Entonces, en la función donde establece sus variables, todo obtiene el valor 10 (puede ver esto en el depurador si coloca un punto de interrupción). Si coloca un registro de consola para a, b, c en esa primera función, todo está bien.
Pero tan pronto como abandonas esa función, la primera (a), y nuevamente, ten en cuenta que, técnicamente en el orden de asignación, es la última, "desaparece" (de nuevo, puedes ver esto en el depurador si establece un punto de interrupción en la segunda función), pero los otros dos (o los muchos que agregue) todavía están disponibles.
Esto se debe a que "dejar" SOLO SE APLICA (solo a los ámbitos locales) LA PRIMERA VARIABLE - nuevamente, que técnicamente es el último en ser declarado y asignado un valor - en la cadena. El resto técnicamente no tiene "let" delante de ellos. Por lo tanto, técnicamente se declaran globalmente (es decir, en el objeto global), por lo que aparecen en su segunda función.
Pruébelo: elimine la palabra clave "let". Todos sus vars ahora estarán disponibles.
"var" tiene un efecto de alcance local similar, pero difiere en cómo se "alza" la variable, que es algo que definitivamente debe entender, pero que no está directamente relacionado con su pregunta.
(Por cierto, esta pregunta sería suficiente para los desarrolladores profesionales de JS para que sea buena).
Le sugiero encarecidamente que pase tiempo con las diferencias en cómo se pueden declarar las variables en JS: sin una palabra clave, con "let" y con "var".
fuente
var
máslet
en el contexto de esta respuesta? No entiendo.var
puede ser propenso a errores si se usa descuidadamente. Mira este violínvar
tiene alguna ventajalet
? Permítanme aclarar: un contexto moderno cuando ambas son opciones y estoy pidiendo un código que uno debería escribir. Cuando pregunté esto antes, recibí respuestas sobre "puede volver a declarar una variable convar
", en cuyo caso tengo que recordarle a la gente que no debería volver a declarar variables . Eso es un error o un error en la lógica del código, por lo que el beneficio de la nueva declaración es ... que le permite escribir código defectuoso. Todavía no he visto ninguna razón sensata a favor devar
cuándolet
también es una opción.En la función
first()
, las variablesb
yc
se crean sobre la marcha, sin usarvar
olet
.Es diferente de
Se vuelven globales implícitos. Por eso están disponibles en
second()
De la documentación
Para evitar esto, puede usar
"use strict"
eso proporcionará errores cuando uno usa una variable no declaradafuente
let a = 10, b = 10, c = 10;
olet a, b, c; a = b = c = 10;
sería la forma correcta de declarar las variables.b
no será evaluada / alcanzada, el error ocurrirá en la línealet a = b = c = 10;
, leída de derecha a izquierda .c
siendo la primera variable que causaReferenceError
, el resto de la línea no se ejecutará (el script se ha detenido)let a = 10, b = a, c = b;
es válido tambiénAntes de llamar las cosas extrañas, conozcamos algunos conceptos básicos primero:
var y let se usan para la declaración de variables en JavaScript. Por ejemplo,
Las variables también se pueden declarar sin usar
var
olet
. Por ejemplo,Ahora la diferencia entre los enfoques anteriores es que:
var
es el alcance de la funcióny
let
es bloque de ámbito.Ahora, de acuerdo con estos conceptos, echemos un vistazo al código en cuestión:
fuente
var
palabra clave se vuelve global, independientemente de dónde se declare" debería ser "el alcance ... se convierte" o "el ámbitos ... convertido en " . Usar las palabras exactas de otra persona requiere una cita, ya sea de aquí o de otra parte. meta.stackexchange.com/q/160071/211183Las variables que usan la
let
palabra clave solo deberían estar disponibles dentro del alcance del bloque y no estar disponibles en una función externa ...Cada variable que está declarando de esa manera no está usando
let
ovar
. Te falta una coma en la declaración de variables.No se recomienda declarar una variable sin la
var
palabra clave. Puede sobrescribir accidentalmente una variable global existente. El alcance de las variables declaradas sin lavar
palabra clave se convierte en global independientemente de dónde se declare. Se puede acceder a las variables globales desde cualquier lugar de la página web.fuente
Es porque cuando no usa
let
ovar
cuando la variable se declara sobre la marcha, mejor declara como sigue.fuente
El extraño problema es causado por las reglas de alcance en JavaScript
Suponiendo que desea declarar 3 variables locales inicializadas al mismo valor (100). Su primer () se verá a continuación. En este caso, second () no tendrá acceso a ninguna de las variables porque son locales a first ()
Sin embargo, si desea variables globales , su primer () se verá a continuación. En este caso, el segundo tendrá acceso a todas las variables porque están en alcance global
Variables locales (también conocidas como accesibles en el bloque de código donde se declaran).
Un bloque de código es cualquier {} con línea (s) de código entre ellas.
Variables globales (también conocido como accesible en el ámbito global).
Estas variables están unidas al objeto global. El objeto global depende del entorno. Es el objeto de ventana en los navegadores.
Nota especial: puede declarar variables en JavaScript sin utilizar las palabras clave var, let, const. Una variable declarada de esta manera se adjunta al objeto global, por lo tanto accesible en el ámbito global.
a = 100 // is valid and is in global scope
Algunos artículos para leer más: https://www.sitepoint.com/demystifying-javascript-variable-scope-hoisting/ https://scotch.io/tutorials/understanding-scope-in-javascript https: //www.digitalocean .com / community / tutorials / understand-variables-scope-hoisting-in-javascript
fuente
La principal diferencia son las reglas de alcance. Las variables declaradas por la palabra clave var tienen un alcance en el cuerpo de la función inmediata (de ahí el alcance de la función) mientras que las variables tienen un alcance en el bloque de cierre inmediato denotado por {} (de ahí el alcance del bloque). Y cuando dices
c y b tienen una vida útil tan divertida como la de tener solo una duración de bloque y si intentas acceder a a haciendo referencia, siempre muestra un error, pero c y b son globales, por lo que no lo notarás. Notarás que no importa cuántos Las variables que agregue a su cadena, solo serán las primeras (a) que causen el error. Esto se debe a que "let" define su variable en el bloque (o "localmente", más o menos significa "entre paréntesis") en el que lo declaras. Si declaras una variable sin "let", la mira globalmente. Entonces, en la función donde configuras tus variables, todo obtiene el valor 10 (puedes ver esto en el depurador si pones un punto de quiebre). Si coloca un registro de consola para a, b, c en esa primera función, todo está bien, pero tan pronto como abandone esa función, la primera (a), y nuevamente, tenga en cuenta que
fuente
Estos son los 3 aspectos interesantes de las declaraciones de variables en JavaScript:
var restringe el alcance de la variable al bloque en el que se define. ( 'var' es para alcance local ).
let permite la anulación temporal del valor de una variable externa dentro de un bloque.
Simplemente declarar una variable sin var o let hará que la variable sea global, independientemente de dónde se declare.
Aquí hay una demostración de let , que es la última incorporación al lenguaje:
Salida:
Explicación:
Las variables a y b se delimitaron dentro de ' first () ', sin var o let palabras clave.
Por lo tanto, un y b son globales, y por lo tanto, se puede acceder a través del programa.
En la función denominada 'segundo' , la instrucción 'let a = 5' establece temporalmente el valor de ' a ' en ' 5 ', solo dentro del alcance de la función.
Fuera del alcance de ' second () ', IE, en el alcance global, el valor de ' a ' será como se definió anteriormente.
fuente