【发布时间】:2015-05-22 13:17:29
【问题描述】:
我的 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>
我的 JS 看起来像这样:
/** @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 是否正确管理内存,还是我做错了?
【问题讨论】:
-
如果 doStuff 确实调用了 doMoreStuff,您的代码将会崩溃。
-
而不是将 ID 传递到您的
doStuff函数中,您可以只传递元素。这意味着您根本不必为动态添加的input元素赋予id属性。doStuff(document.getElementByID(SEED_ID))在您的window.onload中,然后在doStuff(stuff)在您的doMoreStuff()函数中。 -
我想你不明白递归是什么意思。如果 doStuff 调用了 doStuff ,那么真正的递归调用是这样的,那么是的,您可能会遇到问题。您的代码没有任何问题,事实上,将您的代码分成多个函数调用是一种很好的编程习惯,因为这样更易于遵循和维护。
-
@russ - 我担心 doMoreStuff() 永远不会真正得到它的大括号,从而卸载内存。如果你有一个好的链接,我很想了解更多。谢谢!
-
doMoreStuff() 无法到达终点(右括号)的唯一原因是 doStuff() 中的某些内容出错。如果doStuff() 成功,则返回doMoreStuff()。由于doMoreStuff()在doStuff()之后没有更多的行,所以它返回到调用doMoreStuff()的地方。
标签: javascript