关于ERROR RangeError:Maximum call stack size exceeded的问题

哎,这几天在家里憋坏了,想必不止我一个人有这样的感受,整天期盼这上班。但是离上班的地方太远了,还是可望而不可即。

好了,不瞎逼逼了。说正事;

今天翻手机的时候无意间看到了我当时记下的这个错误“ERROR RangeError:Maximum call stack size exceeded”。这个错是我在做Angular项目时遇到的,当是出现这个错就很懵逼,然后请同组的同事都帮忙看了之后,还是无从下手。浏览器也不告诉是哪一行代码出的问题。只有看着有点后怕的“Maximum call stack size exceeded”。于是就是各种百度,百度出来的也就这几种可能出现的原因和解决方法:

1、router里面路径没有声明,有的未定义变量,有的由于是递归函数产生死循环

2、jquery取值的时候没有加val()

然并卵,这些我也都排查了,还是无情的报错,漫漫长征路,还得自己来走,最后经过一些列的排查终于发现了问题所在地,

  原因是:我用订阅subscript((value)=>{})把两个项目互相监听起来了,例如:

                 A.valueChange.subscript((value)=>{

                     B.setValue(‘’);    

                 })

                 B.valueChange.subscript((value)=>{

                     A.setValue('5-01');

                 })

                 C.valueChange.subscript((value)=>{

                     B.setValue(‘bbb’);    

                 })

                 D.valueChange.subscript((value)=>{

                     A.setValue('aaa');

                 })

这样的话,如果A和B项目在初始化的时候都是有值的,而且C和D的值的改变也会影响A和B的值,在这样的情况下就容易在A,B订阅之间造成死循环,只要浏览器不关闭,那么这个循环就会一直跑下去,等跑的浏览器栈都沾满了的话,就会出现上述的“Maximum call stack size exceeded”报错。知道了这个问题之后,解决起来也不是困难,直接在订阅执行一次之后取消订阅即可,如下。

                 A.valueChange.subscript((value)=>{

                     B.setValue(‘’);    

                     // 取消订阅

                     this.subscript.unsubscribe();

                 })

                 B.valueChange.subscript((value)=>{

                     A.setValue('5-01');

                     // 取消订阅

                     this.subscript.unsubscribe();

                 })

总结:

  在遇到“ERROR RangeError:Maximum call stack size exceeded”报错时,解决方案可以按一下步骤:

1、检查router里面路径有没有声明,变量有没有定义,递归函数是否产生死循环

2、jquery取值的时候有没有加val()

3、检查订阅是否产生死循环。

猜你喜欢

转载自www.cnblogs.com/lihuibin/p/12364148.html