这种类型的递归在JavaScript中不好吗?如果是,我应该如何重写它?
我的HTML代码如下所示:这种类型的递归在JavaScript中不好吗?如果是,我应该如何重写它?,javascript,Javascript,我的HTML代码如下所示: <body> <label for="change0">What is your favorite number?</label> <input type="text" id="change0" /> <div id="addStuff"></div> <script src="scripts/main.js"></script> <
<body>
<label for="change0">What is your favorite number?</label>
<input type="text" id="change0" />
<div id="addStuff"></div>
<script src="scripts/main.js"></script>
</body>
/** @type {number} */
var counter = 1;
function doStuff(id) {
var thing = document.getElementById(id);
thing.addEventListener('change', doMoreStuff);
}
function doMoreStuff() {
counter++;
var addStuff = document.getElementById("addStuff");
var stuff = document.createElement("input");
stuff.id = "change" + counter;
stuff.type = "text";
addStuff.appendChild(stuff);
doStuff(stuff.id);
}
window.onload = function() {
/** @constant */
var SEED_ID = "change0"
doStuff(SEED_ID);
};
doMoreStuff()函数递归调用doStuff()函数。JavaScript是否正确地管理内存,还是我做得不正确
doMoreStuff()函数递归调用doStuff()函数
这不是真正的相互递归,因为doStuff
不调用domorseuff
——它只将其设置为要调用的处理程序
JavaScript是否正确管理内存
对。异步“递归”(有时称为“递归”)不会增加调用堆栈,它很像尾部递归。您拥有的不是递归。
doStuff
函数只是将事件处理程序绑定到事件,您可以在事件处理程序中重用该函数
它类似于递归,但等待事件发生会中断链。您需要以不同的方式处理事件,而不是过程代码,否则,当您有几个不同的事件要考虑时,您将遇到困难。
重用代码是一个很好的工具,但在这种情况下,它做的不多。绑定事件的方式并不十分相似,因此您可以在两个位置重复addEventListener
调用,代码变得更加简单:
function doMoreStuff() {
counter++;
var addStuff = document.getElementById("addStuff");
var stuff = document.createElement("input");
stuff.id = "change" + counter;
stuff.type = "text";
addStuff.appendChild(stuff);
stuff.addEventListener('change', doMoreStuff);
}
window.onload = function() {
document.getElementById("change0").addEventListener('change', doMoreStuff);
};
如果doStuff确实调用了domorseuff,那么您的代码将崩溃。您可以只传入元素,而不是将ID传递到
doStuff
函数中。这意味着您根本不必为动态添加的输入元素提供id
属性doStuff(document.getElementByID(SEED_ID))
在窗口中。onload
,然后doStuff(stuff)
在domoresuff()
函数中。我认为您不理解递归的含义。真正的递归调用是如果doStuff调用doStuff,那么是的,您可能会遇到问题。您的代码没有问题,事实上,将代码分成多个函数调用是一种很好的编程实践,因为这样可以更容易地进行操作和维护。@russ-我担心doMoreStuff()永远不会真正到达它的右大括号,从而导致内存不足。如果你有一个好的链接,我想了解更多。谢谢doMoreStuff()无法结束(右大括号)的唯一原因是doStuff()中的某些内容出错。如果doStuff()成功,则返回doMoreStuff()。由于doMoreStuff()在doStuff()之后没有更多的行,因此它将返回到名为doMoreStuff()的位置。非常好的建议,谢谢!