通常、次のようなコード:
var x = {};
...
delete x.foo;
で foo が定義されていなくても、エラーは発生しませんx
。
ただし、IE (Chrome や Firefox ではない) では、作成されたウィンドウとは別のウィンドウのコードから呼び出された場合、「delete x.foo;
SCRIPT438 :オブジェクトはこのプロパティまたはメソッドをサポートしていません」というエラーがスローされます (プロパティがサポートされていない場合)。存在しません。(存在する場合は正常に動作します)。x
foo
HTML ファイルに保存して自分で実行できるテスト コードを次に示します。
<!doctype html>
<html>
<head>
<title>Window 1</title>
<script>
var x = {}, win2, d;
function makewindow2()
{
if (win2&&!win2.closed) win2.focus(); else win2 = window.open("", "win2");
d = win2.document;
d.open();
d.write(
'<!doctype html>\n'+
'<html>\n' +
' <head>\n' +
' <title>Window 2</title>\n' +
' <script>\n' +
' var win1 = window.opener, win1x = win1.x;\n' +
' <'+'/script>\n' +
' </head>\n' +
' <body>\n' +
' This is Window 2\n' +
' <br><br>\n' +
' <input type="button" onclick="delete win1x.foo;" value="Click to delete property foo from Window 1\'s x object">\n' +
' <br><br>\n' +
' <input type="button" onclick="win1x[\'foo\'] = true;" value="Click to set property foo on Window 1\'s x object">\n' +
' </body>\n' +
'</html>');
d.close();
}
</script>
</head>
<body>
This is window 1
<br><br>
<input type="button" onclick="makewindow2()" value="Click to create Window 2">
<br><br>
<input type="button" onclick="delete x.foo;" value="Click to delete property foo from the x object">
<br><br>
<input type="button" onclick="x['foo'] = true;" value="Click to set property foo on the x object">
</body>
</html>
(ウィンドウ 1 と 2 の両方で [ブロックされたコンテンツを許可] をクリックする必要があります)。
foo
ウィンドウ 1 では、任意の順序で何度でも設定または削除できることに注意してください。ただし、Window 2 で設定前に削除しようとしたり、2 回続けて削除しようとすると、すぐにエラーが発生します (IE 11 の場合)。
私の質問は、
(a) この行動の根本的な原因は何か、そして
(b) これはどこかに文書化されていますか? (見つからなかったので)。
(また、この奇妙な動作を文書化したスタックオーバーフローのエントリは、診断が難しいバグを引き起こしている可能性がある人々を助けるかもしれません... :-) )