在声明变量之前在立即调用的异步函数中使用的未悬挂的变量(let,const)

问题描述 投票:0回答:1

以下代码是否可以工作?

(async () => {
  await new Promise(r => setTimeout(r, 1000))
  useNum();
})();

let num = 10;
function useNum(str) {
  return num + 1;
}

https://jsbin.com/tayotitepa/edit?html,output

iOS上的Safari(v13.3)表示不可能(num变量不存在,而Chrome和Firefox认为还可以。

[如果删除await new Promise...行,则Chrome和Firefox抱怨。

在这里看来Chrome和Firefox是正确的,因为我们没有await使用立即调用的异步函数,因此await new Promise...行结束时,其余脚本将已经处理完毕。但我想我会检查一下,因为也许规范说这完全是关于变量声明的ordering和这些变量的用法,所以与“ timing”的使用无关紧要变量。

javascript safari async-await hoisting
1个回答
-1
投票

我在不同的情况下尝试过,我观察到的是

  1. 异步/等待与此无关。
  2. let num被吊起,但值是undefined

所以代码看起来像什么

let num; // --- hoisted with value as undefined
setTimeout(() => {}, 1000)
console.log(useNum());

num = 10; // --- value is assigned here
function useNum(str) {
  return num + 1;
}

[您知道Java脚本是同步的,即它一次执行每行,所以当我们在那时调用useNum方法时,num将是未定义的。

© www.soinside.com 2019 - 2024. All rights reserved.