上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
返回列表 发新帖
楼主: 李恒道 - 

解决递归导致的stack overflow爆堆栈问题

[复制链接]
  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5961

    回帖

    6760

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6760

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 2023-1-21 04:21:53 | 显示全部楼层 | 阅读模式

    例如原代码是递归调用

          function c() {
            a()
          }
          function b() {
            c();
          }
          function a() {
            total++;
            console.log(total)
            if (total == 10000) {
              alert("success");
            }else{
              b();
            }
          }
          a();

    当堆栈大于几万的时候就会导致爆栈
    我们可以给改成迭代调用

          let total = 0;
          const arr = [];
          let active = false;
          function c() {
            funcRunner(() => a());
          }
          function b() {
            c();
          }
          function a() {
            total++;
            console.log(total)
            if (total == 10000) {
              alert("success");
            }else{
              b();
            }
          }
          a();
          function funcRunner(funx) {
            if (active) {
              arr.push(funx);
              return;
            }
            active = true;
            do {
              funx();
            } while ((funx = arr.shift()));
          }

    让迭代器保存待执行的函数的应用
    随即直接返回
    即可让堆栈结束递归
    然后funcRunner开始新一次的函数调用

    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表