在递归中操作变量
Manipulating a variable in a recursion
作为练习,我尝试用一点递归来点燃怪物。工作正常,但是我想在递归为 运行 时使用按钮添加额外的损坏。到目前为止,所有使用按钮设置额外变量的函数都不起作用,因为我似乎无法在递归 运行 时找到影响额外变量的方法。基本上在下面的示例中,我希望按下按钮来执行代码的 "if (monster === 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);
编辑: 可变大小写
作为练习,我尝试用一点递归来点燃怪物。工作正常,但是我想在递归为 运行 时使用按钮添加额外的损坏。到目前为止,所有使用按钮设置额外变量的函数都不起作用,因为我似乎无法在递归 运行 时找到影响额外变量的方法。基本上在下面的示例中,我希望按下按钮来执行代码的 "if (monster === 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);
编辑: 可变大小写