w3schools tag tab style page for color javascript variables global-variables variable-declaration

javascript - tag - Efecto de las variables declaradas y no declaradas



title of page html (4)

Variables globales declaradas y no declaradas

El mecanismo para almacenarlos y acceder a ellos es el mismo, pero JavaScript los trata de manera diferente en algunos casos en función del valor del atributo configurable (que se describe a continuación). En el uso regular, deberían comportarse igual.

Ambos existen en el objeto global

A continuación se presentan algunas comparaciones de variables globales declaradas y no declaradas .

var declared = 1; // Explicit global variable (new variable) undeclared = 1; // Implicit global variable (property of default global object) window.hasOwnProperty(''declared'') // true window.hasOwnProperty(''undeclared'') // true window.propertyIsEnumerable(''declared'') // true window.propertyIsEnumerable(''undeclared'') // true window.declared // 1 window.undeclared // 1 window.declared = 2; window.undeclared = 2; declared // 2 undeclared // 2 delete declared // false delete undeclared // true delete undeclared // true (same result if delete it again) delete window.declared // false delete window.undeclared // true (same result if delete it yet again) delete window.undeclared // true (still true)

Las variables globales declaradas y no declaradas son propiedades del objeto window (el objeto global predeterminado). Ninguno de los dos se hereda de un objeto diferente a través de la cadena de prototipos. Ambos existen directamente en el objeto window (ya que window.hasOwnProperty devuelve true para ambos).

El atributo configurable

Para las variables globales declaradas , el atributo configurable es false . Para variables globales no declaradas , es true . El valor del atributo configurable se puede recuperar utilizando el método getOwnPropertyDescriptor , como se muestra a continuación.

var declared = 1; undeclared = 1; (Object.getOwnPropertyDescriptor(window, ''declared'')).configurable // false (Object.getOwnPropertyDescriptor(window, ''undeclared'')).configurable // true

Si el atributo configurable de una propiedad es verdadero, los atributos de la propiedad se pueden cambiar utilizando el método defineProperty , y la propiedad se puede eliminar utilizando el operador delete . De lo contrario, los atributos no se pueden cambiar y la propiedad no se puede eliminar de esta manera.

En modo no estricto , el operador de delete devuelve true si la propiedad es configurable y devuelve false si no es configurable.

Resumen

Variable global declarada

  • Es una propiedad del objeto global predeterminado ( window )
  • Los atributos de propiedad no se pueden cambiar.
  • No se puede eliminar con el operador de delete

Variable global no declarada

  • Es una propiedad del objeto global predeterminado ( window )
  • Los atributos de la propiedad se pueden cambiar.
  • Se puede eliminar utilizando el operador de delete

Ver también

¿Cuál es la principal diferencia entre las variables declaradas y no declaradas de JavaScript, ya que el operador de eliminación no funciona en las variables declaradas?

var y = 43; // declares a new variable x = 42; delete x; // returns true (x is a property of the global object and can be deleted) delete y; // returns false (delete doesn''t affect variable names)

¿Por qué pasó esto? Las variables declaradas globalmente son también las propiedades del objeto ventana, entonces ¿por qué no se puede eliminar?


Cuando se crea cualquier variable a través de la declaración de variables en JavaScript , estas propiedades se crean con el atributo " DontDelete ", que básicamente significa que la variable que creó no se puede eliminar con la expresión "eliminar". Todas las funciones, argumentos, parámetros de función por defecto se crean con este atributo DontDelete. Puedes pensar en DontDelete como una bandera.

var y = 43; delete y; //returns false because it is has a DontDelete attribute

Mientras que la asignación no declarada no establece ningún atributo como DontDelete . Entonces, cuando aplicamos el operador de eliminación en esta variable no declarada, devuelve verdadero.

x = 42; delete x; //returns true because it doesn''t have a DontDelete attribute

La diferencia entre la asignación de propiedades y la declaración de variables - esta última establece DontDelete, mientras que la anterior no lo hace. Es por eso que la asignación no declarada crea una propiedad eliminable.

Enlace sobre cómo funciona exactamente el operador de eliminación


Eliminar solo es efectivo en las propiedades de un objeto. No tiene ningún efecto sobre los nombres de variables o funciones.

En tu caso x = 42; declara la variable X y la convierte en la propiedad del objeto Global. Entonces vuelve verdadero.

Y var y = 43; declara una variable global que no es parte de ningún objeto, por lo que devuelve falso.


La principal diferencia es cuando declaras variables dentro de una función. Si usa var cuando declara una variable dentro de una función, esa variable se convierte en una variable local. Sin embargo, si no usa var , la variable se convierte en una variable global sin importar dónde la declare (dentro o fuera de una función).