【发布时间】:2017-05-13 14:37:56
【问题描述】:
以下代码应该创建一个简单的“树”,但它会变得递归并崩溃。
var cnt = 0;
var page = {
properties: {},
folders: [],
items: []
};
function createPage() {
var ret = $.extend({}, page);
ret.cnt = cnt++;
return ret;
}
var tree = createPage();
function addFolders(f, n) {
for (var i = 0; i < n; i++) {
f.push(createPage());
}
}
function createData() {
addFolders(tree.folders, 4);
for (var i = 0; i < tree.folders.length; i++) {
addFolders(tree.folders[i].folders, i);
}
}
createData();
谁能解释一下为什么会这样?
【问题讨论】:
-
我很困惑
$.extend({}, page);这是在做什么? -
您的
$.extend没有进行深层复制,因此子文件夹始终是对相同根文件夹的引用。这样做var ret = $.extend(true, {}, page);或直接在createPage()中使用对象文字。 -
@squint 但是,由于它使用一个空对象作为目标,它实际上创建了一个副本......而不是引用。
-
@Black 一个复制对象的 jquery 函数,这里我用它来克隆一个对象而不是递归引用它(也许我做错了)
-
...测试,将
console.log(page.folders.length)放入createPage()。您会看到 originalpage对象的folders发生了变异。有一个计数器在达到100或其他东西时抛出错误是个好主意,这样它就不会无限递归。此外,使用开发人员工具在代码运行时单步执行。
标签: javascript jquery function recursion tree