1

通常,代码如:

var x = {};
...
delete x.foo;

不应导致任何错误,即使 foo 从未在x.

但是,在 IE(但不是 Chrome 或 Firefox)中,如果从与创建窗口不同delete x.foo;的窗口中的代码调用,它会抛出“ SCRIPT438:对象不支持此属性或方法”错误如果该属性不'不存在。(如果它确实存在,它工作正常)。xfoo

以下是一些您可以保存到 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条目可能会帮助那些可能导致难以诊断的错误的人...... :-))

4

0 回答 0