web-dev-qa-db-ja.com

IEのウィンドウプロパティを削除する

この問題に関する情報は見つかりません。 IEで次のコードが機能しないのはなぜですか?

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

IEは「オブジェクトはこのアクションをサポートしていません」というエラーを報告します。 IE問題のウィンドウプロパティを反復することと関係がありますか?

64
gasper_k

私はこのようにします:

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

Gasperは彼が終えた解決策についてコメントしましたが、私は実際の答えとして呼び出す価値があると思います:

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

興味深い問題ですが、今夜は頭を叩いていただけです。例外はIEでスローされますが、Firefoxではスローされません。この回避策でメモリリークが発生するのではないかと思いますので、控えめに使用してください。

それは尋ねられました、なぜ未定義を割り当てないのですか?後でキーを列挙する必要があるかどうかが問題になります(回避策に依存している場合でも、キーの列挙では期待どおりに動作しません...)。しかし、とにかく、削除と単純に未定義を割り当てることの違いを強調するには( 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'));

出力を生成します:

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

これは役に立ちますか?

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

私はこれをIE=で試してみましたが、window.xには値を設定できたことを証明する値がありました。値をnullに設定することは、値をクリアするための最善の策です。

2
Fenton

私は自分のデータのキャッシュを処理するときにこのソリューションを実装しました-データはキャッシュの頻度ではなく、メモリリークが問題になる可能性がありました。コストはかかりますが、定期的にオブジェクトを再マップすることが、手に負えなくなっていないことを確認する最も簡単な方法でした。

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}   

うまくいけば、それは一部にとって有用です!

1
Mikebert4