我正在使用直接Web Remoting (DWR) JavaScript库文件,只在Safari(桌面和iPad)中得到一个错误

它说

超过最大调用堆栈大小。

这个错误到底是什么意思,它是否完全停止处理?

Safari浏览器也有任何修复(实际上是在iPad Safari上,它说

JS:执行超时

我认为这是相同的调用堆栈问题)


当前回答

在我的情况下,问题是,因为我有与父路径相同的子路径:

const routes: Routes = [
  {
    path: '',
    component: HomeComponent,
    children: [
      { path: '', redirectTo: 'home', pathMatch: 'prefix' },
      { path: 'home', loadChildren: './home.module#HomeModule' },
    ]
  }
];

所以我不得不取消了儿童路线的路线

const routes: Routes = [
  {
    path: '',
    component: HomeComponent,
    children: [
      { path: 'home', loadChildren: './home.module#HomeModule' },
    ]
  }
];

其他回答

检测堆栈溢出的问题是,有时堆栈跟踪将被解开,您将无法看到实际发生了什么。

我发现Chrome的一些较新的调试工具在这方面很有用。

点击Performance选项卡,确保Javascript样本被启用,你会得到类似这样的结果。

溢出的地方很明显!如果单击extendObject,您将能够看到代码中确切的行号。

你也可以看到时间,可能有帮助,也可能没有帮助,或者转移注意力。


另一个有用的技巧是,如果你不能真正发现问题,在你认为问题所在的地方放置大量的console.log语句。上面的步骤可以帮助你做到这一点。

在Chrome中,如果你反复输出相同的数据,它会像这样显示问题更清楚。在这个例子中,堆栈在最终崩溃之前击中了7152帧:

在我的例子中,两个jQuery模态是堆叠在一起的。阻止这一切解决了我的问题。

在我的情况下,我得到这个错误的ajax调用和数据,我试图传递的变量没有定义,这是显示我这个错误,但不是描述变量没有定义。我加上定义了变量n的值。

几乎每个答案都说这只能由无限循环引起。这是不正确的,否则您可以通过深度嵌套调用溢出堆栈(并不是说这是有效的,但它肯定是在可能的范围内)。如果你可以控制你的JavaScript虚拟机,你可以调整堆栈大小。例如:

节点——时= 2000

请参见:如何在Node.js中增加最大调用堆栈大小

这意味着在代码的某个地方,您正在调用一个函数,该函数又调用另一个函数,以此类推,直到达到调用堆栈限制。

这几乎总是因为递归函数的基本情况没有得到满足。

查看堆栈

考虑这段代码…

(function a() {
    a();
})();

下面是几次调用后的堆栈…

正如您所看到的,调用堆栈不断增长,直到达到极限:浏览器硬编码的堆栈大小或内存耗尽。

为了修复它,确保你的递归函数有一个基本情况,能够满足…

(function a(x) {
    // The following condition 
    // is the base case.
    if ( ! x) {
        return;
    }
    a(--x);
})(10);