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).