В IE удаление несуществующего свойства завершается неудачно, если объект находится в другом окне. Зачем?
Обычно такой код:
var x = {};
...
delete x.foo;
не должно вызывать никаких ошибок, даже если foo никогда не определяется на x
,
Однако в IE (но не в Chrome или Firefox), если delete x.foo;
вызывается из кода в другом окне, чем x
был создан, он выдаетошибку" SCRIPT438: объект не поддерживает это свойство или метод", если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).
Вы заметите, что в окне 1 вы можете установить или удалить foo
в любом порядке, любое количество раз. Но в Окне 2, если вы попытаетесь удалить его до того, как он будет установлен, или удалите его дважды подряд, вы сразу же получите ошибку (в IE 11).
Мой вопрос
(а) Что является основной причиной такого поведения, и
(б) Это где-то задокументировано? (потому что я не мог его найти).
(Кроме того, я думаю, что запись в стеке потока, документирующая это странное поведение, может помочь людям, для которых это может приводить к трудным для диагностики ошибкам...:-))