如何解決快應用堆棧溢出問題


現象描述

已知將通過 $element('id') 獲取到內容,賦值給成員變量,可能會引發堆棧溢出(RangeError: Maximum call stack size exceeded),從而導致程序崩潰;同時,頁面 DOM 存在成員變量(如 A )的引用,當該變量 A 發生變化時,即會引發堆棧溢出報錯問題,示例代碼如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
< template >
   < div  id = "content" >
     < input  type = "button"  @ click = "onTestClick"  value = "會引發堆棧溢出" />
     < text >{{ stateText }}</ text >
   </ div >
</ template >
< script >
   export default {
     private: {
       mContentNode: null,
       stateText: 'init state'
     },
     onReady() {
       /* 如將 $element('id')獲取到內容,賦值給成員變量,則有可能引發堆棧溢出 */
       this.mContentNode = this.$element('content')
     },
     onTestClick() {
       /* 頁面 DOM 存在成員變量的引用,當發生變化時,即是引發如上所述的一種必現方式 */
       this.stateText = 'new state'
     }
   }
</ script >

 

這是因為賦值為 vm 屬性,會觸發大規模的數據驅動變化,導致內部出現異常循環,從而引發堆棧溢出報錯。

解決方法

只要不將 $element('id') 獲取到內容,賦值給成員變量,即可規避堆棧溢出問題;可以將其賦值給局部變量,或頁面全局變量,示例代碼如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<script>
   let $gContentNode =  null
   export  default  {
     private: {
       stateText:  'init state'
     },
     onReady() {
       /* 如將 $element('id')獲取到內容,賦值給局部變量,或頁面全局變量,則可規避堆棧溢出問題 */
       const cContentNode =  this .$element( 'content' )
       $gContentNode =  this .$element( 'content' )
     },
     onTestClick() {
       this .stateText =  'new state'
     }
   }
</script>

 

原文鏈接:https://developer.huawei.com/...
原作者:Mayism


免責聲明!

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



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