为什么闭包内的函数效果不持久?



我有以下代码(为简洁起见进行了编辑)。当我从Node的实例调用addAttribute时,attributes映射在attributes函数中正确地更新,但是当代码从该函数中退出时,更新就丢失了。

我希望,考虑到attributes是关闭的,这不会发生。有什么想法吗?任何建议,这里将非常感激!

const Node = function(nodeData) {
let attributes = new Map();
const addAttribute = function (attribute) {
attributes = new Map([...attributes, ...attribute]);
console.log(attributes); // Works correctly, as expected.
}
console.log(attributes); // Shows empty map, decidedly not as expected.
return {
attributes,
addAttribute,
}
}

当您调用Node时,它返回一个具有attributes属性的对象。该属性保存了值attributes变量的副本(这是一个空Map)。

之后调用addAttribute,它将用另一个新的Map覆盖attributes变量。

这不会改变之前分配给attributes属性的原始Map。


请记住:attributes属性保存了attributes变量原始值的副本。它保存对变量的引用。


如果你想更新返回的Map,那么你需要改变现有的Map并且不能替换attributes变量的值。

attributes.set( attribute[0], attribute[1] )


为了简化,不使用闭包:

{
const original = new Map([
[1, "one"],
[2, "two"]
]);
const other = new Map([...original, [3, "three"]]);
console.log("original is unchanged", [...original.values()]);
};
{
const original = new Map([
[1, "one"],
[2, "two"]
]);
original.set(3, "three");
console.log("original is mutated", [...original.values()]);
}

最新更新