【发布时间】:2020-05-31 00:14:48
【问题描述】:
下面的代码应该工作吗?
(async () => {
await new Promise(r => setTimeout(r, 1000))
useNum();
})();
let num = 10;
function useNum() {
return num + 1;
}
https://jsbin.com/tayotitepa/edit?html,output
iOS 上的 Safari (v13.3) 说这是不可能的(num 变量不存在),而 Chrome 和 Firefox 认为这很好。
如果您删除 await new Promise... 行,Chrome 和 Firefox 就会抱怨。
Chrome 和 Firefox 似乎在这里是正确的,因为我们不是 awaiting 立即调用的异步函数,所以当 await new Promise... 行完成时,脚本的其余部分已经完成处理。但我想我会检查一下,因为也许规范说它严格关于变量声明的 ordering 和这些变量的用法,所以它的“时间”无关紧要变量的使用。
【问题讨论】:
-
我认为这个问题与
async/await无关。 Safari 是错误的。 -
另外,
let和const被提升;它的工作方式与var提升不同。 -
在 High Sierra 的 Safari 上运行良好
标签: javascript safari async-await hoisting