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
}
Section 12.2.9.3 运行时语义:GetTemplateObject (模板文字 ) https://www.ecma-international.org/ecma-262/7.0/#sec-gettemplateobject描述了如何缓存该值:
- Let realm是当前的领域记录。
- Let 模板注册中心 be realm.[[模板映射]]。
所以从使用到使用应该是一样的tag
在上面的循环中,这对于密钥来说是一个很好的属性。
在我看来, [[TemplateMap]] 必须弱引用模板对象数组,因为否则
for (let i = 0; i < 1e6; ++i) {
eval('(() => {})`' + i + '`');
}
会泄漏内存。
我在规范中没有看到任何内容,但是对于广泛使用的 JavaScript 引擎来说,标记字符串模板的 WeakMap 条目在可重新输入范围内使用的 WeakMap 条目是否最终会被收集?
我问是因为我已经实施了某物 https://www.npmjs.com/package/template-tag-common基于这个假设,但还没有弄清楚如何测试它。