El delete
operador elimina una propiedad de un objeto. No puede eliminar una variable. Entonces, la respuesta a la pregunta depende de cómo se defina la variable o propiedad global.
(1) Si se crea con var
, no se puede eliminar.
Por ejemplo:
var g_a = 1; //create with var, g_a is a variable
delete g_a; //return false
console.log(g_a); //g_a is still 1
(2) Si se crea sin var
, se puede eliminar.
g_b = 1; //create without var, g_b is a property
delete g_b; //return true
console.log(g_b); //error, g_b is not defined
Explicación técnica
1. Usando var
En este caso, la referencia g_a
se crea en lo que la especificación ECMAScript llama " VariableEnvironment " que se adjunta al alcance actual; este puede ser el contexto de ejecución de una función en el caso de usar var
dentro de una función (aunque puede ser un poco más complicado cuando lo considere let
) o en el caso del código "global", el entorno variable se adjunta al objeto global (a menudo window
).
Las referencias en el entorno Variable normalmente no se pueden eliminar: el proceso detallado en ECMAScript 10.5 explica esto en detalle, pero es suficiente decir que a menos que su código se ejecute en un eval
contexto (que la mayoría de las consolas de desarrollo basadas en navegador usan), entonces las variables declaradas con var
no pueden ser eliminado
2. Sin usar var
Al intentar asignar un valor a un nombre sin usar la var
palabra clave, Javascript intenta ubicar la referencia nombrada en lo que la especificación ECMAScript llama " LexicalEnvironment ", y la principal diferencia es que LexicalEvironment s está anidado, es decir, un entorno Lexical tiene un padre ( lo que la especificación ECMAScript llama "referencia de entorno externo") y cuando Javscript no puede localizar la referencia en un entorno Lexical , se ve en el padre entorno Lexical (como se detalla en 10.3.1 y 10.2.2.1 ). El nivel superior de LexicalEnvironment es el " entorno global", y eso está vinculado al objeto global en el sentido de que sus referencias son las propiedades del objeto global. Por lo tanto, si intenta acceder a un nombre que no se declaró utilizando una var
palabra clave en el ámbito actual o cualquier ámbito externo, Javascript finalmente obtendrá una propiedad del window
objeto para que sirva como referencia. Como hemos aprendido antes, las propiedades de los objetos se pueden eliminar.
Notas
Es importante recordar que las var
declaraciones son "izadas", es decir, siempre se considera que ocurrieron al comienzo del alcance en el que se encuentran, aunque no la inicialización del valor que se puede hacer en una var
declaración, que se deja donde está. . Entonces, en el siguiente código, a
es una referencia del entorno Variable y no elwindow
propiedad y su valor estará 10
al final del código:
function test() { a = 5; var a = 10; }
La discusión anterior es cuando el "modo estricto" no está habilitado. Las reglas de búsqueda son un poco diferentes cuando se utiliza el "modo estricto" y las referencias léxicas que se habrían resuelto a las propiedades de la ventana sin el "modo estricto" generarán errores de "variable no declarada" en el "modo estricto". Realmente no entendí dónde se especifica esto, pero es cómo se comportan los navegadores.
var
fuera de una función) son propiedades del "objeto global", que es en los navegadores webwindow
. Entonces,var a = 1; delete window.a; console.log(a);
eliminará con éxito la variable y hará que la última línea emita un error de referencia.