函数外变量如何工作?

How outside-function-variables works?

我不太明白 V8 是如何处理那种代码的,

是否为变量“a”分配堆内存?

是否使用互斥锁来保护变量?

有人可以在此示例中阐明 V8 的内部工作原理吗?

提前致谢

let f, g;
function scope() {
    let a = 1;
    f = async function() {
        a = 2;
    }
    g = function() {
        return a;
    }
};
scope();
f().then( _ => console.log(g()) ); // print 2

Does it allocate heap memory for variable "a"?

我认为我们不应该考虑它。 js虚拟机比较复杂

Does it use mutexes to protect the variable?

Js 是单线程的。在当前同步功能结束之前,没有人 promise/async 会调用。 用过C++这样的语言后很难不去想这些细节,但是js真的很简单

(此处为 V8 开发人员。)

Does it allocate heap memory for variable "a"?

是的。正如 V8 所说,a 将被“上下文分配”,因此在 scope 中创建的闭包(例如 fg)可以访问它(通过它们的“语境”)。这与异步函数无关:如果您只在示例中定义了 g,那仍然会发生。

另外,这是一个实现细节。如果您要实现尽可能简单的 JavaScript 引擎,您只需堆分配所有变量。现代高性能 JS 引擎会尽可能地尝试堆栈分配变量,这就是导致这种区别的原因;但这只是一种优化,不会改变任何可观察到的行为。

Does it use mutexes to protect the variable?

不需要。 async function 不会同时 运行...

so how async functions work ?

...参见例如这里有一个非常详细的描述:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

简而言之,async/await 主要只是语法糖,让您避免“回调地狱”,而是编写看起来直线的代码(但在引擎盖下被分成块).它 不会 向 JavaScript 添加并发性。

every X instructions javascript will check a queue or something to see if there is async functions to execute concurrently ?

否(因为这实际上是并发)。当控制returns到事件循环(即所有活动函数都已返回)时,将调用下一个等待回调。