以下代码是否可以工作?
(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”的使用无关紧要变量。
我在不同的情况下尝试过,我观察到的是
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
将是未定义的。