混淆的两点:
- 功能框架是如何保存和处置的?
例子:
function foo() {
var a = ...;
setTimeout(function() {
console.log(a);
},50);
return a;
}
在这个例子中,setTimeout 中的内部函数正在引用外部变量 a,即使在 foo 返回之后也是如此。来自 Java 世界,我很困惑这怎么会发生?foo 堆栈帧如何存储以供内部函数使用,何时从堆栈中弹出?
- 多个异步/承诺“返回”
例子:
async function foo2() {
var p = new Promise() {
setTimeout(function() {
p.reject(null);
},60000);
p.resolve(await dbcall.execute());
}
return p;
}
在其他地方:
foo2.then(resolve, reject) {
...
}
假设先发生超时调用,然后 dbcall 返回。承诺可能会被解决两次。
问题:超时调用拒绝后,该函数是否仍会继续(a)等待 db 调用返回,然后执行等待之后的任何代码?第二次履行承诺会发生什么(即等待完成时的解析调用)是否只有第一次解析/拒绝得到处理?