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

它说

超过最大调用堆栈大小。

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

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

JS:执行超时

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


当前回答

我有这个错误,因为我有两个同名的JS函数

其他回答

对我来说 我错误地分配了相同的变量名,并给val函数“class_routine_id”

var class_routine_id = $("#class_routine_id").val(class_routine_id);

应该是这样的:

 var class_routine_id = $("#class_routine_id").val(); 

检查Chrome dev工具栏控制台中的错误细节,这将为您提供调用堆栈中的函数,并指导您找到导致错误的递归。

在我的例子中,在app。module中。ts,我得到这个错误,因为我在imports和entryComponents中声明了组件。

Example:

import { MyComponent } from '....';

@NgModule({
  declarations: [
    MyComponent 
  ],
  imports: [
    MyComponent  -- > remove this from here!!!!
  ],
  providers: [],
  bootstrap: [AppComponent],
  entryComponents: [MyComponent]
})
export class AppModule { }

在我的例子中,我使用以下方法将一个大字节数组转换为字符串:

String.fromCharCode.apply(null, new Uint16Array(bytes))

字节包含数百万个条目,这对于堆栈来说太大了。

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

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

查看堆栈

考虑这段代码…

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

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

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

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

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