while (c) {
tag`str0 ${e} str1`
}
JavaScript 运行时创建一个冻结数组,Object.freeze(['str0 ', ' str1'])
但具有附加.raw
属性。
是否可以将该对象用作 a 中的键WeakMap
以避免每次通过循环时都必须基于数组重做工作?
const memoTable = new WeakMap
function tag(templateStrings, ...values) {
let cached = memoTable.get(templateStrings)
if (!cached) {
// Compute cached and put it in the table for next time.
}
// Do something with cached and values
}
第12.2.9.3 节运行时语义:GetTemplateObject ( templateLiteral )描述了如何缓存此值:
- 让领域成为当前领域记录。
- 让templateRegistry为领域.[[TemplateMap]]。
所以tag
在上面的循环中从使用到使用应该是相同的,这对于键来说是一个很好的属性。
在我看来, [[TemplateMap]] 将不得不弱引用模板对象数组,否则
for (let i = 0; i < 1e6; ++i) {
eval('(() => {})`' + i + '`');
}
会泄漏内存。
我在规范中没有看到任何内容,但是对于广泛使用的 JavaScript 引擎,是否最终会收集用于标记字符串模板的 WeakMap 条目不在可重新输入的范围内?
我问是因为我已经根据这个假设实现了一些东西,但还没有弄清楚如何测试它。