简单的JavaScript代码导致Firefox崩溃

9
在Firebug的控制台中:
var a = [];
a[0] = a;

Firefox崩溃了!

为什么?

编辑:

  1. 这个陈述在逻辑上是正确的,引用递归没有任何问题。因此,这是一个浏览器 Firebug的错误。
  2. 在Chrome和Opera中正常工作。
  3. 我正在使用最新版本的Firebug和Firefox

编辑2:它在Firebug控制台中崩溃,在本机Firefox Web控制台中工作。


非常有趣,将数组推入自身。我认为这是无限递归,这就是为什么它会崩溃FF,并且可能会崩溃任何浏览器。您打算使用这种类型的数组做什么? - Teemu
@GGG 嗯,当将第一个数组分配给同一数组的第一个索引(或任何索引)时,分配会无限继续。这不是崩溃吗? - Teemu
@Teemu 不对,试着在控制台中运行...它会创建一个具有指向自身的属性的对象,但这并不罕见(window.selfwindow.top等)。 - Dagg Nabbit
@GGG 是的,我测试过了。结果很有趣,即使在检查中也没有崩溃,甚至在FF中也没有。如果值得尝试,请使用以下代码:var a=new Array(); a[0]=a; a[0][0]='foo'; alert(a[0][0]); - Teemu
2个回答

4

我认为这是一个 firebug 的 bug。

在内置的firefox控制台(ctrl+shift+k),chrome控制台和opera控制台中均能正常工作。

我会向firebug提交一个 bug 报告。


2

这样做本质上没有问题,但是你正在构建一个“包含”自身(实际上包含对自身的引用)的数据结构。

当显示这种类型的结构时,如果代码没有考虑到这种可能性,调试器很可能会无限递归(甚至可能导致堆栈溢出),试图到达无限循环的结尾。

a[0][0][0][0]...

2
有趣的是它在Chrome中运行得很好,似乎只有在展开对象时才检查其属性。现在我想知道 top.top.top... 怎么不会破坏firebug。 - Dagg Nabbit
加油!它并没有创建a[0][0]....!这个引用是有效的,但它没有单独的对象,它引用的是同一个__a__。 - Viller
@Viller: 没有人说过那个。问题只在于Firebug使用的算法是否能够处理自我引用数组的字符串表示转换。 - 6502

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接