关于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、检查订阅是否产生死循环。