下面的代码应该工作吗?
if(true) {
async function bar() {
console.log("hello");
}
}
bar();
Run Code Online (Sandbox Code Playgroud)
Chrome 80 和 Firefox 72 都抛出了未定义的ReferenceError说法bar。所以看起来async function bar() {...}声明是块范围的,而function bar() {...}声明是函数范围的?如果是这种情况,我会感到困惑,但是有人可以通过指向规范相关部分的链接为我确认这一点吗?
另外,有没有办法async function在块内声明时声明函数范围?
Cross-Origin-Embedder-Policy和Cross-Origin-Opener-Policyheaders 可以用标签设置吗<meta>?还是只能用实际的 headers 设置?如果没有,是否有可以使用元标记设置的标头列表?
以下示例记录crossOriginIsolated: false到控制台。
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Cross-Origin-Embedder-Policy" content="require-corp">
<meta http-equiv="Cross-Origin-Opener-Policy" content="same-origin">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>COOP/COEP header test</title>
</head>
<body>
<script>console.log("crossOriginIsolated:", self.crossOriginIsolated)</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
如果我删除这些http-equiv元标记并使用实际的 HTTP 标头提供文件,那么它会记录crossOriginIsolated: true(在 Chrome 和 Firefox 中)。所以看来我无法使用元标记设置这些标头?
html http-headers cross-origin-embedder-policy cross-origin-opener-policy
鉴于此代码:
let arr = await fetch(...).then(r => r.json());
for(let [a, b] of arr) {
console.log(a, b);
}
Run Code Online (Sandbox Code Playgroud)
.for is not iterable什么可能导致Chromium/Node.js 中出现神秘/无用的错误消息?在 Firefox 上,错误消息是Uncaught TypeError: arr[Symbol.iterator]().next().value is not iterable。
这让我困惑了几分钟,所以我想,在他们使这些错误消息变得更加友好之前,有一个这样的问题/答案会很有帮助。请参阅下面的答案。
我创建了两个文件,每个文件包含 100,000 个div元素。第一个是slow.html:
<div>0.8562158266079849</div>
<div>0.9135280673563708</div>
...
<div>0.5053808333117775</div>
<div>0.9188260452433614</div>
Run Code Online (Sandbox Code Playgroud)
第二个是fast.html:
<style>
div {
content-visibility:auto;
contain-intrinsic-size: 100vw 18.5px;
}
</style>
<div>0.8562158266079849</div>
<div>0.9135280673563708</div>
...
<div>0.5053808333117775</div>
<div>0.9188260452433614</div>
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,每个都div只是填充了一个随机的十进制数。slow.html和之间的唯一区别fast.html是 fast.html 的<style>顶部有该块。
slow.html加载大约需要 2.7 秒:
fast.html加载大约需要 17 秒:
因此,content-visibility:auto页面加载速度非但没有加快,反而减慢了很多。我是否误解和/或误用content-visibility?它不是为我有大量非常简单的元素的情况而设计的吗?
我的预期用例是帮助加快内容表格的渲染速度,在这种情况下不值得实现虚拟滚动,因为它们只是供内部分析使用的快速/杂乱/一次性工具。
我已经在 Chrome v89 和 v90 上进行了测试。两者的加载时间大致相同。
这里有一句台词可以帮助您快速复制这一点:
new Array(50000).fill(0).map(_ =>`<div>${Math.random()}</div>`).join("\n")
Run Code Online (Sandbox Code Playgroud)
请注意,在我之前的测试中,使用content-visibilityandcontain-intrinsic-size已按预期工作(大大减少了渲染时间),但奇怪的是,它在这个最小的示例中不起作用。
html ×2
javascript ×2
async-await ×1
cross-origin-embedder-policy ×1
css ×1
http-headers ×1
iterator ×1
node.js ×1
scope ×1