通常,代码如:
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 单击“允许阻止的内容”)。
您会注意到,在窗口 1 中,您可以foo
按任意顺序设置或删除任意次数。但是在 Window 2 中,如果您在设置之前尝试将其删除,或者连续删除两次,您将立即收到错误消息(在 IE 11 中)。
我的问题是,
(a) 这种行为的根本原因是什么,以及
(b) 这是否记录在某处?(因为我找不到它)。
(另外,我认为记录这种奇怪行为的stackoverflow条目可能会帮助那些可能导致难以诊断的错误的人...... :-))