Gasper ha fatto un commento con la soluzione ha finito, ma penso che ne vale la pena gridando come una risposta reale:
try
{
delete window.x;
}
catch(e)
{
window["x"] = undefined;
}
questione interessante Stavo solo sbattendo la testa contro di esso stasera. L'eccezione è lanciata su IE ma non su Firefox. Sospetto che questa soluzione rimanga in memoria, quindi usala con parsimonia.
È stato chiesto, perché non assegnare solo undefined? È importante se si desidera enumerare le chiavi in un secondo momento (anche se si sta facendo affidamento sulla soluzione alternativa, l'enumerazione delle chiavi non farà comunque ciò che si desidera ...). Ma tant'è, per evidenziare la differenza tra eliminazione e semplicemente assegnando indefinito (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 un output:
cleared has key a
deleted has a? false
cleared has a? true
fonte
2009-12-01 05:47:58
E tanto per essere chiari, perché non sembra che nessuno abbia detto questo in nessuna delle risposte: questo è un * bug * in Internet Explorer. Non c'è nulla nella specifica del 1999 (3a edizione) che consente di lanciare un'eccezione da 'delete', anche se la proprietà è inesistente o non cancellabile (che il tuo' window.x' non dovrebbe essere in ogni caso), e la nuova quinta edizione specifica consente solo eccezioni generate da 'elimina' nella nuova modalità rigorosa. Non c'è niente di speciale in 'window' in questo senso. Eppure, il motore JScript in IE8 * ancora * mostra questo bug, nel 2010. * sigh * –
[Buon articolo pertinente] (http://perfectionkills.com/understanding-delete/). – alex
T.J. Crowder, la finestra non è un oggetto, è un accessorio del namespace di root. Non ha proprietà in quanto tali, quindi quando si esegue l'eliminazione su di esso, come in questo caso, non è obbligato a rimuoverle effettivamente per qualsiasi motivo. L'impostazione indefinita sul nome dell'oggetto va bene perché il gc attraverserà ed eliminerà gli oggetti non referenziati. Spero che questo aiuti a capire il vero problema qui e perché questo non è tanto un bug in quanto è una scelta di implementazione scarsa per il linguaggio che si sta lentamente aggiornando per modernizzare –