ITPub博客

首页 > 移动开发 > 移动测试 > 如何解决快应用堆栈溢出问题

如何解决快应用堆栈溢出问题

原创 移动测试 作者:华为开发者论坛 时间:2021-07-30 09:37:32 0 删除 编辑

现象描述

已知将通过 $element('id')  获取到内容,赋值给成员变量,可能会引发堆栈溢出(RangeError: Maximum call stack size exceeded ),从而导致程序崩溃;同时,页面 DOM  存在成员变量( 如 A ) 的引用,当该变量 A  发生变化时,即会引发堆栈溢出报错问题,示例代码如下:

<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')  获取到内容,赋值给成员变量,即可规避堆栈溢出问题;可以将其赋值给局部变量,或页面全局变量,示例代码如下:

<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/consumer/cn/forum/topic/0204465500063450107?fid=0101271690375130218

原作者:Mayism

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69970551/viewspace-2784229/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2020-04-21

  • 博文量
    402
  • 访问量
    726943