这种类型的递归在JavaScript中不好吗?如果是,我应该如何重写它?

这种类型的递归在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> <

我的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>
/** @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()的位置。非常好的建议,谢谢!