哎,這幾天在家里憋壞了,想必不止我一個人有這樣的感受,整天期盼這上班。但是離上班的地方太遠了,還是可望而不可即。
好了,不瞎逼逼了。說正事;
今天翻手機的時候無意間看到了我當時記下的這個錯誤“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、檢查訂閱是否產生死循環。