Gasper hizo un comentario con la solución que terminó, pero creo que es digna de ser llamada como una respuesta real:
try
{
delete window.x;
}
catch(e)
{
window["x"] = undefined;
}
tema interesante , Solo estaba golpeando mi cabeza contra esta noche. La excepción se produce en IE pero no en Firefox. Sospecho que esta solución filtra memoria, así que utilícela con moderación.
Se le preguntó, ¿por qué no simplemente asignar undefined? Importa si desea enumerar las claves más adelante (aunque si confía en la solución alternativa, la enumeración de claves aún no hará lo que quiera ...). Pero de todos modos, para poner de relieve la diferencia entre borrar y simplemente asignar indefinido (http://jsfiddle.net/fschwiet/T4akL/):
var deleted = {
a: 1
};
var cleared = {
a: 1
};
delete deleted["a"];
cleared["a"] = undefined;
for(var key in deleted) {
console.log("deleted has key", key);
}
for(var key in cleared) {
console.log("cleared has key", key);
}
console.log("deleted has a?", deleted.hasOwnProperty('a'));
console.log("cleared has a?", cleared.hasOwnProperty('a'));
produce una salida:
cleared has key a
deleted has a? false
cleared has a? true
Y para que quede claro, porque no parece que nadie haya dicho esto en ninguna de las respuestas: Este es un * error * en Internet Explorer. No hay nada en la especificación de 1999 (3ª edición) que permita lanzar una excepción desde 'eliminar', incluso si la propiedad no es inexistente o no recuperable (que su' window.x' no debería ser en cualquier caso), y el La nueva especificación de quinta edición solo permite excepciones lanzadas desde 'delete' en el nuevo modo estricto. No hay nada especial acerca de 'window' en este sentido. Y, sin embargo, el motor de JScript en IE8 * aún * exhibe este error, en 2010. * suspiro * –
[Artículo relevante]] (http://perfectionkills.com/understanding-delete/). – alex
T.J. Crowder, la ventana no es un objeto, es un acceso al espacio de nombres raíz. No tiene propiedades como tales, por lo que cuando ejecuta eliminar en él, como en este caso, no está obligado a eliminarlos por ningún motivo. Definir indefinido en el nombre del objeto está bien porque el gc pasará y eliminará los objetos sin referencia. Espero que esto ayude a entender el problema real aquí y por qué esto no es tanto un error, ya que es una mala elección de implementación para el lenguaje que se está actualizando lentamente para modernizar –