我一直在玩arguments.callee
,偶然发现了这个问题。
我的想法是匿名功能将在启动时运行,然后在几秒钟后再次运行。
setTimeout(async function() {
console.log('Not working')
return arguments.callee
}(), 1000)
如果我的匿名功能不是async
setTimeout(function() {
console.log('Working just fine')
return arguments.callee
}(), 1000)
让我感到困惑的是,当我在console.log(arguments.callee)
函数中async
时,它就很好了。
setTimeout(function() {
console.log(arguments.callee)
}, 1000)
setTimeout(async function() {
console.log(arguments.callee)
}, 2000)
有人可以向我解释为什么该功能为async
时不起作用吗?
答案 0 :(得分:3)
这是因为当您从async
函数返回内容时,它包装在 Promise 中,因此arguments.callee
实际上是该函数您想返回,但它包装在一个诺言中。
来自MDN:
异步函数是异步运行的函数 通过事件循环,使用隐式Promise返回其结果。
(async function() {
console.log('Not working')
return arguments.callee
}()).then((fun) => fun());
//the wrapped function can be executed in the chained then callback
正如@ Oliver Nybo在评论中指出的那样,我们还可以在await
上下文中使用async
来等待使用函数值解决承诺:
(async () => {
setTimeout(await async function() {
console.log('Not working');
return arguments.callee;
}(), 1000)
})();