在 mac 开发者工具中和 微信app 皆可复现


两个页面:index 和 game


1   index 页面点击按钮 navigateTo 跳转到 game 页面

2   game 页面自动开一个 setInterval 绘制一个 100 秒的 canvas (canvas 元素是写死在 wxml 中的) 倒计时

3   倒计时未结束时(比如还有90秒),用户点击左上角返回按钮返回到 index 页面

4   再次 index 页面点击按钮 navigateTo 跳转到 game 页面

5   game 页面的 canvas 正在被两个 setInterval  重复绘制

6   这样反复操作 N 次,game 页面的 canvas 就会被 N 个 setInterval  重复绘制



结论: js 线程不随页面销毁的销毁而销毁,按照小程序生命周期的逻辑,game 页面返回到 index 页面,那么 game 页面出栈,应该被销毁,为什么 js 线程还在执行?  setTimeout  和 setInterval 这种 异步回调都不销毁,why??   难道要监听 game 页面的 onUnload,手动清除所有回调??  这样的设计初衷是什么 ,这不内存一直泄露了么?


后来试了下  全局变量也不销毁








展开全部
收起
5回答
提交回答
  • 至过去的我

    2044人对此回答表示赞同

    我是未来的你,你现在是不是在年找寻小程序答案。你不要感觉诧异,给你来信原因,就是让你不在后悔。今天去学习如何推广小程序,相信......点击查看更多>
    发布于
  • Samantha栗子

    17人对此回答表示赞同

    所有开发者写的.js都是运行在同一个线程的,这个线程只有在小程序被销毁是才会被销毁。

    展开
    17
    0回复
    发布于 5年前

    评论(0)

    收起评论

  • 三层楼

    12人对此回答表示赞同

    this.setData({timer:setInterval(()=>{},1000)})

    展开
    12
    0回复
    发布于 5年前

    评论(0)

    收起评论

  • 大耳朵图图

    11人对此回答表示赞同

    同一时间只存在一个页面js线程可以理解,indexPage.js和gamePage.js线程上下文也是相互隔离的,但是为什么gamePage这个页面触发了onUnload之后页面出栈,为什么gamePage.js线程的上下文不清空,之后再次进入还是有页面出栈之前的上下文

    展开
    11
    0回复
    发布于 5年前

    评论(0)

    收起评论

  • Violet

    11人对此回答表示赞同

    需要自己清除setInterval,我是根据页面url来做判断,出了这个页面就clearInterval,不主动clearInterval的话出了页面他也会继续执行下去,而且如果你是写在页面生命周期的话,就会有多个setInterval.

    展开
    11
    0回复
    发布于 5年前

    评论(0)

    收起评论

  • Cat7

    9人对此回答表示赞同

    求回答

    展开
    9
    0回复
    发布于 5年前

    评论(0)

    收起评论

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
咨询热线

13312967497

扫码添加业务即可随时咨询 还可领取小程序推广攻略

业务咨询: 13312967497
扫码咨询

扫码咨询套餐

回到顶部