在递归中操作变量

Manipulating a variable in a recursion

本文关键字:变量 操作 递归      更新时间:2023-09-26

作为练习,我试图用一点递归来点燃一个怪物。工作正常,但是我想在递归运行时使用按钮增加额外的伤害。到目前为止,所有使用按钮设置额外变量的函数都不起作用,因为我似乎找不到在递归运行时影响变量的方法。基本上在下面的示例中,我希望按下按钮来执行当前"如果(怪物 === 55)..."代码的一部分正在执行。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <script type="text/javascript">
        function print(text) { document.querySelector("#content").innerHTML += text + "'n"; }
        </script>
        <title>Monster</title>
    </head>
    <body>
        <input type="button" id="btnPoke" value="Poke it" onclick="" />
        <pre id="content"></pre>
        <script type="text/javascript">
            var monster = 100;
            var extra = 10;
            function setonfire(monster, extra) {
                setTimeout(function () {
                    print("Monster: " + monster + ", Extra: " + extra);
                    if (monster > 0) {
                        if (monster === 55) {
                            monster = monster - extra;
                            print("Poke for an extra " + extra);
                        }
                        monster = monster - 5;
                        setonfire(monster, extra);
                    }
                }, 200);
            }
            setonfire(monster, extra);
        </script>
    </body>
</html>

我希望这不会太愚蠢,但我真的很茫然,可能陷入了思想错误。我希望任何能告诉我概念错误的地方的输入。我的怀疑要么是范围问题,要么是递归

Javascript 按值传递原语。 因此,当您调用setonfire(monster, extra);时,您将值 100 传递给该方法,它永远不会影响外部monster变量。

可以直接在方法中引用monster对象。所以:

var monster = 100;
var extra = 10;
function setonfire(extra) {
    setTimeout(function () {
        print("Monster: " + monster + ", Extra: " + extra);
        if (monster > 0) {
            if (monster === 55) {
                monster = monster - extra;
                print("Poke for an extra " + extra);
            }
            monster = monster - 5;
            setonfire(extra);
        }
    }, 200);
}
setonfire(extra);

否则,将monster设为对象,例如:

var monster = { health: 100 };
var extra = 10;
function setonfire(monster, extra) {
    setTimeout(function () {
        print("Monster: " + monster.health + ", Extra: " + extra);
        if (monster.health > 0) {
            if (monster.health === 55) {
                monster.health = monster.health - extra;
                print("Poke for an extra " + extra);
            }
            monster.health = monster.health - 5;
            setonfire(monster, extra);
        }
    }, 200);
}
setonfire(monster, extra);

编辑:可变大小写