關於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、檢查訂閱是否產生死循環。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM