web-dev-qa-db-fra.com

Suppression d'une propriété de fenêtre dans IE

Je ne trouve aucune information sur cette question; Pourquoi le code suivant ne fonctionne-t-il pas?

window.x = 45;
delete window.x;
// or delete window['x'];

IE RAPPORTS Un "objet ne prend pas en charge cette action". Cela a-t-il quelque chose à voir avec cela itérant sur les propriétés de la fenêtre dans IE?

64
gasper_k

Je le ferais de cette façon:

    window[x] = undefined;
    try{
        delete window[x];
    }catch(e){}
36
user155314

Gardon a fait un commentaire avec la solution qu'il a terminée, mais je pense que sa peine d'appeler comme une réponse réelle:

try 
{ 
    delete window.x; 
} 
catch(e) 
{ 
    window["x"] = undefined; 
}

Numéro intéressant, je me faisais de me frapper la tête contre ce soir. L'exception est levée sur IE mais pas Firefox. Je soupçonnerais que cette solution de contournement fuit la mémoire, utilisez donc avec parcimonie.

On a demandé pourquoi ne vient pas d'attribuer indéfini? Cela compte si vous voulez énumérer les clés plus tard (bien que si vous comptez sur la solution de contournement, l'énumération de la clé ne fera toujours pas ce que vous voulez ...). Mais de toute façon, pour mettre en surbrillance la différence entre Supprimer et simplement affecter indéfini ( 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'));

produit la sortie:

cleared has key a
deleted has a? false
cleared has a? true 
49
Frank Schwieterman

Est-ce que cela aide?

window.x = 45;
alert(window.x);
window.x = null;

J'ai essayé cela dans IE et window.x a eu une valeur, ce qui le prouve peut être défini. Réglage de la valeur sur NULL est votre meilleur choix pour le nettoyer.

2
Fenton

J'ai mis en œuvre cette solution lors de la mise en cache de mes propres données - les données n'étaient pas beaucoup la fréquence du cache était telle que la fuite de la mémoire pourrait être devenue un problème. C'est coûteux, mais la remappage périodique de l'objet était le moyen le plus simple pour moi d'être sûr qu'il ne sortait pas de la main.

obj = {a: 1, b: 2, c: 3};
var max;

function unset(obj, key) {
    try {
        delete obj[key];
    } catch (e) {
        obj[key] = undefined;
    }

    max++;

    if(max > 200) {
        var keys = Object.keys(obj);
        var len = keys.length;
        var n_obj = {};
        for(var i = 0; i < len; i++) {
            if(obj.hasOwnProperty(keys[i]) && obj[keys[i]] !== undefined) {
                n_obj[keys[i]] = obj[keys[i]];
            }
        }
        return n_obj;
    }
    return obj;
}

obj; //{a: 1, b: 2, c: 3}
obj = unset(obj, "b"); //{a: 1, b: undefined, c: 3} OR {a: 1, c: 3}
//and then eventually we'll garbage collect and...
obj = unset(obj, "b"); //{a: 1, c: 3}   

J'espère que c'est utile à certains!

1
Mikebert4