小编joe*_*joe的帖子

`function` 声明是函数范围的,而 `async function` 声明是块范围的吗?

下面的代码应该工作吗?

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在块内声明时声明函数范围?

javascript scope async-await

7
推荐指数
1
解决办法
87
查看次数

可以使用元标记(http-equiv)设置 COOP/COEP 标头吗?

Cross-Origin-Embedder-PolicyCross-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

6
推荐指数
1
解决办法
2245
查看次数

TypeError: .for 不可迭代 / array[Symbol.iterator]().next().value 不可迭代

鉴于此代码:

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

这让我困惑了几分钟,所以我想,在他们使这些错误消息变得更加友好之前,有一个这样的问题/答案会很有帮助。请参阅下面的答案。

javascript iterator node.js

6
推荐指数
1
解决办法
8742
查看次数

为什么 content-visibility:auto 在这个简单的示例中不起作用?

我创建了两个文件,每个文件包含 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 秒:

Slow.html 页面加载性能饼图

fast.html加载大约需要 17 秒:

fast.html页面加载性能饼图

因此,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 css

5
推荐指数
1
解决办法
1587
查看次数