Ich kann keine Informationen zu diesem Problem finden; Warum funktioniert der folgende Code nicht im IE?
window.x = 45;
delete window.x;
// or delete window['x'];
IE meldet den Fehler „Objekt unterstützt diese Aktion nicht“. Hat es etwas mit dem Iterieren über Fenstereigenschaften im IE-Problem zu tun?
Gasper machte einen Kommentar mit der Lösung, mit der er fertig war, aber ich denke, es lohnt sich, als tatsächliche Antwort zu rufen:
try {
delete window.x;
} catch(e) {
window["x"] = undefined;
}
Interessantes Problem, ich habe mir heute Abend nur den Kopf dagegen geschlagen. Die Ausnahme wird im IE, aber nicht im Firefox ausgelöst. Ich würde vermuten, dass diese Problemumgehung Speicherlecks verursacht, also verwenden Sie sie sparsam.
Es wurde gefragt, warum nicht einfach undefined zuweisen? Es spielt eine Rolle, ob Sie die Schlüssel später aufzählen möchten (wenn Sie sich jedoch auf die Problemumgehung verlassen, wird die Schlüsselaufzählung immer noch nicht das tun, was Sie wollen …). Aber trotzdem, um den Unterschied zwischen dem Löschen und dem einfachen Zuweisen von undefined (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'));
Erzeugt Ausgabe:
cleared has key a
deleted has a? false
cleared has a? true
Ich würde es so machen:
window[x] = undefined;
try{
delete window[x];
}catch(e){}
Hilft das?
window.x = 45;
alert(window.x);
window.x = null;
Ich habe dies im IE ausprobiert und window.x hatte einen Wert, der beweist, dass er eingestellt werden kann. Setzen Sie den Wert auf null, um ihn zu löschen.
Und nur um das klarzustellen, weil es nicht so aussieht, als hätte das jemand in irgendeiner der Antworten gesagt: Dies ist ein Insekt im Internet-Explorer. In der Spezifikation von 1999 (3. Ausgabe) gibt es nichts, was das Auslösen einer Ausnahme erlaubt
delete
auch wenn die Eigenschaft nicht vorhanden oder nicht löschbar ist (was Ihrewindow.x
sollte auf keinen Fall sein), und die neue Spezifikation der 5. Ausgabe erlaubt nur Ausnahmen, die von ausgelöst werdendelete
im neuen strikten Modus. Daran ist nichts Besondereswindow
diesbezüglich. Und doch ist die JScript-Engine in IE8 still zeigt diesen Fehler im Jahr 2010. seufzen– TJ Crowder
28. März 2010 um 12:44 Uhr
Guter relevanter Artikel.
– Alex
18. November 2011 um 5:31 Uhr
TJ Crowder, window ist kein Objekt, es ist ein Zugriff auf den Root-Namespace. Es hat keine Eigenschaften als solche. Wenn Sie also delete darauf ausführen, wie in diesem Fall, ist es nicht verpflichtet, sie aus irgendeinem Grund tatsächlich zu entfernen. Das Festlegen von undefined für den Namen des Objekts ist in Ordnung, da der GC durchkommt und nicht referenzierte Objekte eliminiert. Ich hoffe, dies hilft, das eigentliche Problem hier zu verstehen und warum dies weniger ein Fehler als vielmehr eine schlechte Implementierungswahl für die Sprache ist, die langsam aktualisiert wird, um sich zu modernisieren
– Jeffrey Gilbert
27. Oktober 2015 um 20:12 Uhr