我有一个存储编辑器内容的令牌列表。列表中的每个节点都有一个 dom 节点的映射。为什么是地图?因为相同的文本块可能出现在页面的多个位置,我希望所有实例通过相同的数据结构保持同步。
在这些 dom 节点的映射中,我想使用容器 dom 节点作为双向链表每个节点上 WeakMap 中的键,其中值是该列表节点令牌的 dom 节点。这样,如果从 dom(和容器注册表)中清除编辑器的实例,则列表将丢失对各个令牌节点的所有引用,而无需遍历列表以手动删除映射中的引用。
这是我正在谈论的玩具示例:
let containers = new Set([])
let container1 = document.createElement('div')
let container2 = document.createElement('div')
containers.add(container1)
containers.add(container2)
let root = document.getElementById('root')
root.append(container1)
root.append(document.createElement('hr'))
root.append(container2)
let tokens = ['foo', 'bar', 'baz']
let head = {};
let list_node = head;
for (let token of tokens) {
list_node.token = token;
list_node.dom = new WeakMap()
containers.forEach(container_node => {
let token_node = document.createElement('span')
token_node.textContent = list_node.token
list_node.dom.set(container_node, token_node)
container_node.append(token_node)
})
list_node.next = {}
list_node = list_node.next
}
https://jsfiddle.net/ujs6vpfq/3/
我的问题是,如果我在多个 WeakMaps 中使用同一个 dom 容器节点作为键,那会构成多个引用并防止垃圾收集吗?我知道没有办法对此进行测试,因为无法询问 WeakMaps 以找到它们所持有的值。